3

我已经对我的整个 repo 进行了 git-svn checkout(以标准git svn init -t tags -b branches -T trunk $repo_url方式初始化,然后git svn fetched)。我手动svn copy $repo_url/branches/branch1 $repo_url/branches/branch2。然后我跑了git svn fetch,,git checkout -b local-branch2 branch2做了一些提交branch2dcommit将它们编辑回 SVN 存储库,并完成了我的工作branch2。(为什么要分支一个分支?我想在 git 中本地破解这个分支,但仍然提交回 SVN 并在我工作时从几个同事那里获得帮助)。

我没有做的是将branch2工作合并回branch1. 如果 I git checkout -b local-branch1 branch1, then ,它只是将我的指针git merge branch2快进到 where is。local-branch1branch2

相反,我希望 git 重放自开始branch2到 branch1 以来所做的所有提交,以便我可以将它们中的每一个提交到 SVN 存储库。似乎有办法做到这一点,但我想不出。也许git rebase,或者git cherry-pick每个提交的一个branch2?(虽然后者有点乏味)。我宁愿不要 svn 将这两个 URL 合并在一起,因为那会造成很大的伤害。

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

4

1 回答 1

6

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

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

于 2009-07-10T21:39:03.123 回答