使用Git分叉SVN项目的最佳方法

时间:2010-05-06 18:26:44

标签: svn git merge git-svn fork

我使用Git分叉了一个SVN项目,因为我需要添加他们不想要的功能。但与此同时,我希望能够继续将他们添加到上游版本的功能或修复功能下载到我的分支中(它们不会发生冲突)。所以,我的Git项目包含以下分支:

  • master - 我实际从
  • 构建和部署的分支
  • feature _ *** - 我工作或处理过新事物的功能分支,然后在完成后合并为主人
  • vendor-svn - 我的本地git-svn分支,允许我从他们的svn repo“git svn rebase”
  • 供应商 - 我将vendor-svn合并到的本地分支机构。然后我将这个(供应商)分支推送到公共git repo(github)

所以,我的流程是这样的:

git checkout vendor-svn
git svn rebase
git checkout vendor
git merge vendor-svn
git push origin vendor

现在,问题出现在这里:我需要检查他们所做的每个提交(最好是单独的,因为此时我在他们后面约有二十个提交)之前将它们合并到master中。我知道我可以运行 git checkout master; git merge vendor ,但这会引入所有更改并提交它们,而我无法看到它们是否与我需要的内容冲突。

那么,最好的方法是什么? Git似乎是处理项目分支的一个很棒的工具,因为你可以从多个回购中提取和推送 - 我只是没有足够的经验知道这样做的最佳方式。

这是我正在讨论的原始SVN项目:https://appkonference.svn.sourceforge.net/svnroot/appkonference

我的叉子位于github.com/jthomerson/AsteriskAudioKonf

1 个答案:

答案 0 :(得分:6)

看起来你应该为master进行测试创建一个分支:

git checkout -b testing master
git merge vendor-svn
# test...
git checkout master
git merge testing

或者,如果您想测试单个提交,可以一次单独合并它们:

git checkout -b testing master
git log --pretty=%H testing..version-svn | while read commit; do git merge $commit || break; done
# now go check out and test each merge that was created

或者一次一个:

git checkout -b testing master
git merge $(git log --pretty=%H testing..version-svn | tail -n 1)
# now test the result, and if you're okay...
# run the merge command again to merge the next commit
git merge $(git log --pretty=%H testing..version-svn | tail -n 1)
# and so on

你可能更喜欢后者,因为你可以在尝试合并下一个提交之前测试该提交。历史将是丑陋的,所以你显然想要回去并重新将其重新整合为一个合并。

无论哪种方式都可以确定并将rerere.enabled设置为true,这样git就会记住你是如何解决冲突的,当你返回并直接重新合并为主时,你就不必解决它们了再次!