如何使用git svn仅拒绝选定的补丁?

时间:2009-06-10 17:55:24

标签: git-svn

我的git-svn repo中有许多本地提交的补丁,我尚未提交给我们的svn回购。正常的“git svn dcommit”会将所有这些补丁提交给svn。我只想提交一些补丁(简单的错误修复),但不提交其他补丁(未经测试的重大修改)。我怎么能用git svn做到这一点?

3 个答案:

答案 0 :(得分:10)

我一直在这里遵循这个程序:

http://fredericiana.com/2009/12/31/partial-svn-dcommit-with-git/

如果你很舒服,那就很好了。

答案 1 :(得分:5)

这就是我最终做的事情。起点是与svn同步的“master”分支,我的所有本地补丁都在顶部。

  1. 创建一个新分支(wip =正在进行中)。

    git branch wip 
    

    这会生成当前分支的副本,包括尚未提交给svn的所有补丁。当前分支将保持为“主”并且不会更改。

  2. 使用rebase从中删除不需要的本地补丁:

    git rebase -i HEAD~10
    
  3. 现在“master”分支有你可以安全提交的补丁:

    git svn dcommit
    

    “wip”分支现在有一些尚未准备好分享的重大变化。实际上,我希望他们留在那里这是我停止的地方。一切都完成后,可以从“wip”分支执行svn dcommit。但为了完整起见,并回答原始问题,还有最后一步:

  4. 使用git cherry-pick将未提交的更改提取回“master”分支,最后使用git branch -d wip删除无用的分支。

答案 2 :(得分:2)

使用git,你实际上不应该在单个变更集上运行。我所知道的最好的方法是为任何非平凡的工作创建本地分支。这样,您未经测试的主要更改将最终出现在您的git存储库的不同分支中,并且您将能够非常轻松地区分它们。

如果这是您目前遇到的问题,您可以创建一个新的分支,从上次从svn更新的点开始,然后使用git-cherry-pick将您的简单错误修复转移到这个新的分支,从中然后你可以提交给svn。

从更长远的角度来看,最好有自己的“主”分支由subversion trunk构成,然后是:

  1. 每次从svn更新时重新启动所有分支,然后将您想要获取的svn合并到主服务器并从那里进行dcommit。
  2. 使用常规git-merge合并来自svn的内容,然后通过git diff ..my_branch | patch -p1将内容合并到主人的dcommits,这将消除git-svn无法处理的历史记录。这种方法对于最终合并来说更复杂,但允许你在git本身之间合并分支(可能还有其他人)。