10

我的 git-svn 存储库中有许多本地提交的补丁,我还没有提交到我们的 svn 存储库。一个普通的“git svn dcommit”会将所有这些补丁提交到 svn。我只想提交我的一些补丁(简单的错误修复),而不是其他的(未经测试的重大更改)。我怎样才能用 git svn 做到这一点?

4

3 回答 3

10

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

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

如果你对 rebase 感到满意,它会很好地工作。

于 2010-03-16T21:41:20.217 回答
5

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

  1. 创建一个新分支(wip = Work In Progress)。

    git branch wip 
    

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

  2. 使用变基从“master”中删除不需要的本地补丁:

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

    git svn dcommit
    

    “wip”分支现在具有尚未准备好共享的主要更改。实际上,我希望他们留在那里,这就是我要停下来的地方。一旦一切完成,就可以从“wip”分支执行 svn dcommit。但是为了完成,为了回答最初的问题,还有最后一步:

  4. 使用 将未提交的更改拉回“主”分支git cherry-pick,最后使用git branch -d wip.

于 2009-06-23T06:16:51.063 回答
2

使用 git,您实际上不应该对单个变更集进行操作。我知道的最好的方法是为任何重要的工作创建本地分支。这样,您未经测试的主要更改将最终出现在您的 git 存储库的不同分支中,您将能够很容易地区分它们。

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

从更长远的角度来看,最好让你自己的“主”分支由颠覆主干制成,然后:

  1. 每次从 svn 更新时,重新设置所有分支的基础,然后将要获取 svn 的分支合并到您的 master 并从那里 dcommit。
  2. 使用常规git-merge合并来自 svn 的内容,然后将内容合并到您的 master 以进行 dcommits by git diff ..my_branch | patch -p1,这将消除 git-svn 无法处理的历史记录。这种方法对于最终合并更为复杂,但允许您在 git 本身中合并分支(可能还有其他人)之间的内容。
于 2009-06-13T16:55:42.813 回答