2009-07-10 133 views
3

我有一个git-svn结帐我的整个回购(初始化在标准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回购,并用我的工作完成了branch2。 (为什么要分支?我想在git中本地攻击这个分支,但仍然在SVN中提交并在一些同事的帮助下工作)。git-svn:如何将git提交从一个SVN分支复制到另一个分支?

我没有做的是合并branch2工作回到branch1。如果我是git checkout -b local-branch1 branch1,那么git merge branch2,它只是将我的local-branch1指针快速转发到branch2所在的位置。

相反,我希望git能够重放自从启动branch2以来进行的所有提交到branch1,以便我可以将它们中的每一个提交给SVN回购。似乎有办法做到这一点,但我想不起来。也许git rebase,或者branch2上的每个提交的git cherry-pick? (尽管后者有点乏味)。我宁愿不svn将这两个URL合并在一起,因为这是一个很大的伤害。

想法?这需要更多解释的任何部分?

+0

*“为什么要分支?”*因为git。是。 – naught101 2015-01-05 03:54:50

回答

6

不在local-branch1上的branch2上的第一次提交可能是创建branch2的提交,是吗?这应该显示为git中的空提交(例如,消息,但不包含内容)。复制它的sha1标识符。然后在local-branch1中,尝试git reset --hard branch2 && git rebase --onto [email protected]{1} SHA1(其中SHA1是复制的sha1)。这应该重播所有的提交,除了空的一个回到分支1上。你很可能现在想要做一个交互式重新分配和编辑每个提交,这样你就可以去掉git-svn-id:这行git-svn为你添加的(或者你可以写一个git-filter-branch脚本来完成,如果有足够的提交)。

出于好奇,你为什么要重播每一个提交?如果你想简单地合并你的修改,那就简单多了,你可以做git checkout local-branch1 && git merge --squash branch2 && git commit。这会做非快进合并,但实际上并不会产生合并提交(因为那些混淆了git-svn)。相反,它会产生等效的工作树,就像合并发生一样,但只有一个父亲。这反映了svn如何合并工作。

+0

看起来像所有的工作,谢谢。 我不想做壁球提交,因为我想保留每个提交在回购(差异和提交消息),以防万一我需要稍后退步。不过,下次我必须重新考虑这种方法时,因为这有点麻烦。 – cbowns 2009-07-10 22:09:23

相关问题