git-svn:如何将git提交从一个SVN分支复制到另一个分支?

3
我有一个完整的repo的git-svn checkout(按照标准方式初始化:git svn init -t tags -b branches -T trunk $repo_url,然后git svn fetch)。我手动执行了svn copy $repo_url/branches/branch1 $repo_url/branches/branch2。然后运行了git svn fetch,git checkout -b local-branch2 branch2,对branch2进行了一些提交,将它们dcommit回SVN repo,完成了对branch2的工作。(为什么要分支?我想在本地git上修改这个分支,但仍然提交到SVN并从几个同事那里得到帮助)。
我没有合并branch2的工作到branch1中。如果我git checkout -b local-branch1 branch1,然后git merge branch2,它只是快速转发我的local-branch1指针到branch2的位置。
相反,我希望git重新播放从启动branch2以来所做的所有提交到branch1中,以便我可以将每个提交都dcommit到SVN repo。似乎有一种方法可以做到这一点,但我想不出来。也许是git rebase,或者对在branch2上进行的每个提交进行git cherry-pick?(尽管后者有点繁琐)。我不想将两个URL合并到一起,因为那会带来很多麻烦。
有什么想法吗?这其中的哪些部分需要更多的解释?

"为什么要在分支上再创建一个分支?" 因为 Git。是的。 - naught101
1个回答

6
在本地分支1上,第一次不在本地分支1上的分支2提交是创建分支2的提交,对吗?这应该在git中显示为空提交(例如有消息,但没有内容)。复制其sha1标识符。然后在本地分支1上尝试git reset --hard branch2 && git rebase --onto local-branch1@{1} SHA1(其中SHA1是复制的sha1)。这将重新播放除空提交外的所有提交回到分支1上。您现在很可能想要进行交互式重排并编辑每个提交,以便可以剥离git-svn为您添加的git-svn-id行(或者如果有足够的提交,则可以编写一个git-filter-branch脚本来执行此操作)。
出于好奇,您为什么要重新播放每个提交?如果您只想合并您的更改,那就简单得多了,您只需执行git checkout local-branch1 && git merge --squash branch2 && git commit。这将执行非快进合并,但实际上不会生成合并提交(因为它们会混淆git-svn)。相反,它将生成等效的工作树,就像发生了合并,但只有一个父级。这与svn合并的工作方式相似。

看起来一切都顺利,谢谢。我不想进行压缩提交,因为我想保留仓库中的每个提交(差异和提交消息),以防以后需要回退任何内容。不过下次我再做这个操作时可能会重新考虑这种方法,因为这有点混乱。 - cbowns
另外,我的一个朋友为我尝试了一下:git-svn 现在更好地忽略了提交消息中现有的 git-svn-id 行,并且不会将其提交到错误的分支。 - cbowns
在进行了几次提交后,git svn info 再次显示我在错误的分支上进行 dcommit(它将我放在 branch2 上)。我使用了 cherry-pick 和 reset 的方式回到了 branch1,然后执行了 git checkout master; git reset --hard branch1 将 master 分支恢复到了我想要的状态。 - cbowns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接