我的 git-svn 存储库中有许多本地提交的补丁,我还没有提交到我们的 svn 存储库。一个普通的“git svn dcommit”会将所有这些补丁提交到 svn。我只想提交我的一些补丁(简单的错误修复),而不是其他的(未经测试的重大更改)。我怎样才能用 git svn 做到这一点?
3 回答
我一直在遵循这里的程序:
http://fredericiana.com/2009/12/31/partial-svn-dcommit-with-git/
如果你对 rebase 感到满意,它会很好地工作。
这就是我最终做的事情。起点是与 svn 同步的“master”分支,上面有我所有的本地补丁。
创建一个新分支(wip = Work In Progress)。
git branch wip
这会复制当前分支,包括所有尚未提交到 svn 的补丁。当前分支将保持为“主”并且不会更改。
使用变基从“master”中删除不需要的本地补丁:
git rebase -i HEAD~10
现在“master”分支有了可以安全提交的补丁:
git svn dcommit
“wip”分支现在具有尚未准备好共享的主要更改。实际上,我希望他们留在那里,这就是我要停下来的地方。一旦一切完成,就可以从“wip”分支执行 svn dcommit。但是为了完成,为了回答最初的问题,还有最后一步:
使用 将未提交的更改拉回“主”分支
git cherry-pick
,最后使用git branch -d wip
.
使用 git,您实际上不应该对单个变更集进行操作。我知道的最好的方法是为任何重要的工作创建本地分支。这样,您未经测试的主要更改将最终出现在您的 git 存储库的不同分支中,您将能够很容易地区分它们。
如果这是您目前遇到的问题,您可能可以从您上次从 svn 更新的点创建一个新分支,然后使用git-cherry-pick将您的简单错误修复转移到这个新分支,然后您可以从中dcommit 到 svn。
从更长远的角度来看,最好让你自己的“主”分支由颠覆主干制成,然后:
- 每次从 svn 更新时,重新设置所有分支的基础,然后将要获取 svn 的分支合并到您的 master 并从那里 dcommit。
- 使用常规git-merge合并来自 svn 的内容,然后将内容合并到您的 master 以进行 dcommits by
git diff ..my_branch | patch -p1
,这将消除 git-svn 无法处理的历史记录。这种方法对于最终合并更为复杂,但允许您在 git 本身中合并分支(可能还有其他人)之间的内容。