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

cbo*_*wns 3 git version-control git-svn

我有一个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和几个同事寻求帮助,而我的工作就可以了).

我没有做的是将branch2工作合并回来branch1.如果我git checkout -b local-branch1 branch1,那么git merge branch2,它只是快速转发我的local-branch1指针到哪里branch2.

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

想法?这需要更多解释吗?

Lil*_*ard 6

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

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