部分提交Subversion

时间:2008-09-16 19:07:07

标签: svn git

鉴于此案例,我在一个文件中进行了两次独立更改:例如。添加了一种新方法并改变了另一种方法。

我经常不希望将这两项更改都作为一次提交,而是作为两次独立提交。

在git存储库中,我会使用git-add(1)交互模式 hunk 拆分为较小的:

 git add --patch

使用Subversion执行此操作的最简单方法是什么? (甚至可能使用Eclipse插件)

更新
The Thing About Git中,Ryan称之为:“纠缠不清的工作副本问题。”

11 个答案:

答案 0 :(得分:59)

Tortoise SVN 1.8 now supports这与它的“提交后恢复”功能。这允许您对文件进行编辑,在提交

后撤消所有编辑

根据文档:

  

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

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

答案 1 :(得分:41)

我使用TortoiseSVN完成了此操作。

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

使用diff实用程序的创建备份功能

  1. 转到提交您的文件,就像您要提交所有更改一样。
  2. 在提交窗口中,双击该文件以显示差异。
  3. 在差异设置中,单击备份原始文件选项。
  4. 右键单击您不想要的更改,然后使用选择使用其他文本块
  5. 将差异保存一次。每次保存时都会覆盖备份。这就是你只想保存一次的原因。
  6. 承诺改变。
  7. 使用创建的.bak文件覆盖原始文件(将包含所有原始更改)。
  8. 提交文件。
  9. 您现在应该使用两个单独的提交来提交所有更改。

答案 2 :(得分:32)

使用git-svn,您可以创建远程SVN存储库的本地GIT存储库,使用完整的GIT功能集(包括部分提交)使用它,然后将其全部推送回SVN存储库。

git-svn (1)

答案 3 :(得分:24)

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

仅当您有工作的补丁文件时才使用svn revert out.c还原原始文件。

手动编辑补丁文件,使其仅包含 hunks 以进行添加或修改。使用patch命令将它们应用于原始文件,测试添加是否有效,然后svn commit添加。

out.patch.modify贴片洗涤重复冲洗。

如果文件中的更改与您提出的初始问题分开,则添加新方法,更改现有方法 - 这将有效

这是一个非常繁琐的解决方案 - 虽然我不相信你应该有任何理由将你的提交分开。

您还可以检查同一来源的多个工作副本以应用您的工作:

  

svn co http://location/repository methodAdd

     

svn co http://location/repository methodModify

务必svn up并进行测试以确保一切正常。

答案 4 :(得分:10)

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

  

4.4.1。提交对话框

     

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

     

<剪断>

     

4.4.3。只提交部分文件

     

有时您只想提交对文件所做更改的部分内容。通常这种情况   当你正在处理某些事情但需要紧急修复时会发生这种情况   要提交,并且该修复恰好在您所在的文件中   继续努力。

     

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

     

提交完成后,将恢复文件的副本   自动,并且您拥有包含所有修改的文件   没有回复。

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

答案 5 :(得分:7)

我曾经这样做过:

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

这是一种简单的方法,假设一组更改很容易撤消。对于更复杂的情况,我会放弃并提交两个更改而不用担心它。

现在我使用git,这是我希望我再也不用做了!

答案 6 :(得分:4)

我使用本地darcs repo,或者只是逐渐合并更改。通过合并(opendiff打开FileMerge,Xcode附带的合并程序;替换为您最喜欢的合并工具):

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 repo并将提交同步到svn主服务器;在我有限的经历中表现很好。

答案 7 :(得分:3)

试试VisualSVN for Visual Studiolatest 6.1 release引入了QuickCommit功能。您可以使用Visual Studio编辑器中的新提交此块提交选择上下文菜单命令,在文件中部分提交所选更改。

enter image description here

答案 8 :(得分:2)

  1. 在编辑选择中打开要分割的所有文件
  2. 使用不同的工具集(在Win上,使用Spike的建议(旧版本))退出第二组
  3. 提交
  4. 返回您的编辑选项并保存所有文件
  5. 这比Spike的完整建议风险更高,但更容易做到。另外,请确保先尝试其他内容,因为有些编辑会拒绝保存已更改的文件,除非您重新加载该文件(丢失所有更改)

答案 9 :(得分:0)

I think an easier option than generating diff files, reverting, etc, would be to have two copies of the repository checked out, and use a visual diff tool like DeltaWalker to copy hunks from one to the other.

The first copy would be the one you actually work off of, and the second would just be for this purpose. Once you've made a ton of changes to the first, you can copy one section over to the second, commit it, copy another section, commit it, etc.

答案 10 :(得分:0)

  1. 将所有相关修改的文件复制到备份副本。
  2. 使用svn diff创建工作状态的补丁。
  3. 使用svn revert恢复文件。
  4. 使用patch工具或手动编辑等重新应用您要提交的修补程序部分。
  5. 之后运行diff,将您的工作副本与备份进行比较,以确保正确应用了补丁部件。
  6. 构建和测试。
  7. 提交。
  8. 将备份副本复制回存储库签出。
  9. 重复2.(不是1.!)直到完成。