部分提交Subversion

鉴于这种情况,我在一个文件中做了两个独立的更改 :例如。 增加了一个新的方法,改变了另一种方法

我经常不想把这两个改变作为一个提交,而是作为两个独立的提交。

在git仓库上,我会使用git-add(1)的交互模式大块分成更小的块:

git add --patch 

用Subversion做这个最简单的方法是什么? (甚至可能使用Eclipse插件)

更新:
在“关于Git的事情”中 ,Ryan称之为“纠结的工作拷贝问题”。

使用git-svn,你可以创build远程SVN仓库的本地GIT仓库,使用完整的GITfunction集(包括部分提交)处理它,然后将其全部推回到SVN仓库。

git-svn(1)

龟SVN 1.8现在支持这个“提交后恢复”function。 这允许您对文件进行编辑,并在提交之后撤消所有编辑

根据文档:

仅提交与某个特定问题相关的文件部分:

  1. 在提交对话框中,右键单击文件,select“提交后恢复”
  2. 编辑例如TortoiseMerge中的文件:撤消您不想提交的更改
  3. 保存文件
  4. 提交文件

我用TortoiseSVN做了这个。

内置的合并实用程序允许您在存储库版本和工作副本之间显示差异。

使用diff实用程序的创build备份function

  1. 转到提交您的文件,就好像您要提交所有更改一样。
  2. 在提交窗口中,双击该文件以显示差异。
  3. 在差异设置中,单击选项备份原始文件
  4. 右键单击不需要的更改,然后使用select 使用其他文本块
  5. 保存差异一次 。 每次保存时,备份将被覆盖。 这就是为什么你只想保存一次。
  6. 提交更改。
  7. 使用创build的.bak文件覆盖原始文件(这将包含所有原始更改)。
  8. 提交你的文件。

您现在应该已经完成​​所有更改,使用两个单独的提交。

尝试使用svn diff > out.patch然后将out.patch文件复制到out.patch.addout.patch.modify

只有当你有一个工作补丁文件使用svn revert out.c恢复原始文件。

手动编辑补丁文件,使其只包含用于添加或修改的区块 。 使用patch命令将它们应用到原始文件,testing添加是否工作,然后svn commit添加。

洗涤冲洗重复out.patch.modify修补程序。

如果文件中的更改与您最初提出的问题是分开的 – 添加了新方法,则更改现有方法 – 这将起作用

这是一个非常乏味的解决scheme – 虽然我不相信你应该有任何理由分开你的提交。

您也可以检出同一来源的多个工作副本,以将您的工作应用于:

svn co http://location/repository methodAdd

svn co http://location/repository methodModify

一定要检查一下,确保一切正常。

从v1.8开始,可以使用TortoiseSvn(Windows)。

4.4.1。 提交对话框

如果您的工作副本是最新的并且没有冲突,则您已准备好提交更改。 select你想提交的任何文件和/或文件夹,然后TortoiseSVN→提交….

<剪断>

4.4.3。 只提交部分文件

有时您只想提交对文件所做的部分更改。 这种情况通常发生在你正在做某事的时候,但是紧急的修复需要被提交,而修复恰好在你正在处理的同一个文件中。

右键单击该文件并使用上下文菜单→提交后恢复。 这将创build一个文件的副本。 然后你可以编辑这个文件,例如在TortoiseMerge中,撤消所有你不想提交的改变。 保存这些更改后,您可以提交该文件。

提交完成后,文件的副本将自动恢复,并且具有所有未提交的修改的文件。

在Linux上,我会尝试http://webstaff.itn.liu.se/~karlu20/div/blog/2013-05-31_SVNPartialCommit.php 。 不过,我自己并没有尝试过。

我曾经这样做过:

  • 在我的编辑器(我使用vim)中,编辑文件,以便只出现其中一个变化
  • 保存文件(但不要退出编辑器)
  • 将更改的文件提交到svn
  • 在编辑器中点击“撤消”足够多的时间来重新显示第二组更改
  • 再次保存该文件
  • 提交第二组更改。

这是一个简单的方法,假设一组更改相当容易撤消。 对于更复杂的情况,我会放弃和承诺这两个变化,而不用担心。

现在我使用git,这是我希望我永远不会再做的事情!

我使用本地darcs回购,或者只是逐步合并更改。 合并(opendiff打开FileMerge,一个Xcode自带的合并程序;用你最喜欢的合并工具replace):

 cp file file.new svn revert file opendiff file.new file -merge file 

合并相关更改,保存合并,退出合并程序

 svn ci -m 'first hunk' file mv file.new file svn ci -m 'second hunk' file 

如果文件中有不止一个不相关的块,冲洗并重复(但为什么你会等待很久才提交?!)

另外,如果你知道git,你可以使用git-svn来维护一个本地git仓库,并将你的提交同步到一个svn主服务器; 在我有限的经验中工作很棒。

  1. 打开您想要在select编辑器中分割的所有文件
  2. 使用不同的工具集(Win上,使用Spike的build议(旧版本))退出第二套
  3. 承诺
  4. 回到你select的编辑器并保存所有的文件

这比Spike的全面build议稍微有些风险,但可以更容易做到。 另外请确保先尝试一下其他的东西,因为有些编辑会拒绝保存已经从它们下面改变过来的文件,除非你重新加载该文件(丢失所有的改变)

我认为比生成差异文件,还原等更容易的select是将版本库的两个副本签出,并使用像DeltaWalker这样的可视化差异工具将hunk从一个拷贝到另一个拷贝。

第一个副本是你实际工作的副本,第二个副本只是为了这个目的。 一旦你对第一个做了大量的改变,你可以复制一个部分到第二个部分,提交它,复制另一个部分,提交它等等。

  1. 将所有相关修改的文件复制到备份副本。
  2. 使用svn diff创build一个工作状态的补丁。
  3. 使用svn revert文件。
  4. 重新应用你想要提交的补丁的部分,无论是使用patch工具,或手动编辑,或任何。
  5. 之后运行diff比较您的工作副本与您的备份,以确保您正确应用补丁部分。
  6. build立和testing。
  7. 承诺。
  8. 将您的备份副本复制回您的存储库检出。
  9. 重复2.(不在1.!),直到完成。