关于svn:部分提交Subversion

Partial Commits with Subversion

考虑到这种情况,我在一个文件中进行了两个独立的更改: 添加了新方法并更改了另一种方法。

我通常不想将两个更改都提交为一个提交,而是两个独立的提交。

在git仓库上,我将使用git-add(1)的交互模式将大块拆分为较小的块:

1
 git add --patch

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

更新:
Ryan在《关于Git的事情》中称其为:"纠结的工作副本问题"。


Tortoise SVN 1.8现在通过"提交后还原"功能支持此功能。这使您可以对文件进行编辑,并在提交后撤消所有编辑

根据文档:

To commit only the parts of the file that relate to one specific issue:

  • in the commit dialog, right-click on file, choose"restore after commit"
  • edit the file in e.g. TortoiseMerge: undo the changes that you don't want to commit yet
  • save the file
  • commit the file

  • 我已经使用TortoiseSVN做到了。

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

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

  • 就像提交所有更改一样,提交您的文件。
  • 在提交窗口中,双击文件以显示差异。
  • 在差异设置中,单击选项以备份原始文件。
  • 右键单击不需要的更改,然后使用选择使用其他文本块。
  • 差异仅保存一次。每次保存时,备份将被覆盖。这就是为什么您只想保存一次的原因。
  • 提交更改。
  • 用创建的.bak文件覆盖原始文件(将进行所有原始更改)。
  • 提交文件。
  • 现在,您应该使用两个单独的提交来提交所有更改。


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

    git-svn(1)


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

    仅当您有可用的补丁程序文件时,才使用svn revert out.c还原原始文件。

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

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

    如果您的第一个问题说的是文件中的更改是分开的-添加新方法,更改现有方法-这将起作用

    这是一个非常乏味的解决方案-尽管我不认为您应该有任何理由来分开提交。

    您还可能签出了同一来源的多个工作副本,以将您的工作应用于:

    svn co http://location/repository methodAdd

    svn co http://location/repository methodModify

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


    从v1.8开始,可以使用TortoiseSvn(Windows)进行此操作。

    4.4.1. The Commit Dialog

    If your working copy is up to date and there are no conflicts, you are ready to commit your changes. Select any
    file and/or folders you want to commit, then TortoiseSVN → Commit....

    4.4.3. Commit only parts of files

    Sometimes you want to only commit parts of the changes you made to a file. Such a situation usually
    happens when you're working on something but then an urgent fix needs
    to be committed, and that fix happens to be in the same file you're
    working on.

    right click on the file and use Context Menu → Restore after commit.
    This will create a copy of the file as it is. Then you can edit the
    file, e.g. in TortoiseMerge and undo all the changes you don't want to
    commit. After saving those changes you can commit the file.

    After the commit is done, the copy of the file is restored
    automatically, and you have the file with all your modifications that
    were not committed back.

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


    我曾经这样做:

    • 在我的编辑器(我使用vim)中,编辑文件,以便仅显示其中一项更改
    • 保存文件(但不要退出编辑器)
    • 将更改的文件提交到svn
    • 在编辑器中按"撤消"足够多次,以再次出现第二组更改
    • 再次保存文件
    • 提交第二组更改。

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

    现在,我使用git,这是我希望不再需要做的事情!


    尝试使用VisualSVN for Visual Studio。最新的6.1版本引入了QuickCommit功能。您可以使用Visual Studio编辑器中新的"提交此阻止和提交选择"上下文菜单命令来部分提交文件中的选定更改。

    enter image description here


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

    1
    2
    3
    cp file file.new
    svn revert file
    opendiff file.new file -merge file

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

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

    如果文件中有多个不相关的块,请冲洗并重复(但是为什么要等这么长时间才提交?!)

    另外,如果您知道git,则可以使用git-svn来维护本地git repo并将提交提交同步到svn主服务器。根据我有限的经验,效果很好。


  • 在选择器中打开要拆分的所有文件
  • 使用不同的工具集(在Win上,使用Spike的建议(旧版本))退出第二组
  • 承诺
  • 返回您的选择编辑器并保存所有文件
  • 这比Spike的完整建议要冒险一些,但操作起来更容易。还要确保先尝试其他方法,因为某些编辑器将拒绝保存从其下更改而来的文件,除非您重新加载该文件(丢失所有更改)


  • 将所有相关的修改文件复制到备份副本。
  • 使用svn diff创建工作状态补丁。
  • 使用svn revert还原文件。
  • 使用patch工具或通过手动编辑等方式重新应用希望提交的补丁程序部分。
  • 之后运行diff以将工作副本与备份进行比较,以确保正确应用了修补程序部分。
  • 构建和测试。
  • 承诺。
  • 将您的备份副本复制回存储库签出中。
  • 重复2。(而不是1.!)直到完成。

  • 我认为比生成差异文件,还原等更容易的选择是检出存储库的两个副本,并使用可视差异工具(如DeltaWalker)将大块从一个复制到另一个。

    第一个副本将是您实际使用的副本,第二个副本将仅用于此目的。对第一部分进行大量更改后,您可以将一个部分复制到第二个部分,然后提交,复制另一个部分,提交等等。


    推荐阅读