12

所以我正在使用 git 并与 svn repo 交互。

我有一个看起来像这样的 svn TRUNK:

A-B-C-D

还有一个在提交 B 或 C 处分支的 svn bug_fixes 分支:

 -c-d-e-f-g-h-i

现在我需要将 svn 分支中的 cdefghi 提交返回到 master 分支。

我知道我可以只做一个压扁的提交,让我们称之为 squash SQUASH (其中将包含 cdefghi),但看起来我必须杀死 bug_fixes 分支并启动一个新分支才能干净地继续。

在这里:http ://blog.red-bean.com/sussman/?p=92他们建议:

checkout分支。

mergemaster 对分支的更改。

Checkout大师。

merge --reintegrate分支更改为 master。

继续发展。

不幸的是,git-svn 似乎无法识别 svn 的任何“merge --reintegrate”命令。

那么如何使用 git-svn 的命令干净地使分支和主控拥有所有提交,以便两者的开发可以继续?

4

5 回答 5

7

文档警告部分git-svn警告

为了简单和与能力较差的系统(SVN)互操作,建议所有git svn用户clone,直接从 SVN 服务器,并避免所有/// fetchgit存储库和分支之间的操作。dcommitgit clonepullmergepush

作者确实提供了一个建议:

在 git 分支和用户之间交换代码的推荐方法是git format-patchand git am,或者只是dcommiting 到 SVN 存储库。

适应你的情况

git format-patch --stdout c^..i >my.patch
git reset --hard trunk
git am <my.patch

whereci是您历史记录中提交的适当标识符。

于 2010-01-29T21:23:24.617 回答
3

好的,我发现了一些方法:

git checkout your_branch
git rebase master
git checkout master
git merge your_branch

或者

git checkout your_branch
git rebase master
git checkout master
git merge --squash your_branch

或者

git checkout your_branch
git rebase master
git checkout master
git rebase -i your_branch

然后在这一切之后。

git svn dcommit (to commit to master)
git branch -D your_branch

然后(从 svn 因为 git-svn 不支持删除)删除分支,并从主干重新创建它并重新开始循环。

于 2010-02-01T00:29:46.857 回答
1

如果您 dcommit 合并,它会自动将其压缩为 1 个提交。遗憾的是,它没有在内部使用 svn:mergeinfo 或 --reintegrate ,因此您失去了与通过“git svn branch”创建的分支的关联。

于 2010-06-17T19:34:25.953 回答
1

<branchpoint>..i将本地内容 ( ) 重新定位到从 SVN 获取的新主服务器上,这不是一个好案例吗?

于 2010-01-31T13:46:39.590 回答
1

您还可以做的是cherry-pick,前提是您不使用merge

这两个语句都应该在没有更改的情况下在分支上完成。

前提是 c 比 i 更老并且您想要获取整个序列。

git cherry-pick c..i

或单独提交

git cherry-pick c d e f g h i
于 2013-10-23T12:00:22.520 回答