使用svn.pushmergeinfo进行合并的git-svn工作流程

时间:2012-06-19 17:31:18

标签: git svn merge git-svn mergeinfo

使用git-svn合并svn跟踪分支的正确工作流程是什么。我已经阅读了一些关于git-svn svn.pushmergeinfo配置密钥的内容,请注意:

来自http://www.kernel.org/pub/software/scm/git/docs/git-svn.html

  

config key:svn.pushmergeinfo

     

此选项将导致git-svn   尝试自动填充中的svn:mergeinfo属性   SVN存储库尽可能。目前,这只能在何时完成   dcommitting非快进合并所有父母,但第一个   已被推入SVN。

所以我的正常工作流程是:

假设我有一个SVN分支^ / branches / feature_branch

# Ensure git-svn is configured to populate svn:mergeinfo
git config --global svn.pushmergeinfo true   

# Update my local svn remotes state
git svn fetch

# Track a local branch against a remote SVN backed ^/branches/feature_branch 
git checkout -b local_feature_branch remotes/feature_branch

# Modify files and commit to local git repo
git commit -a -m "changes"
# Push changes to SVN branch ^/branches/feature_branch
git svn dcommit

然后将^ / trunk合并到我的local_feature_branch我假设我做了类似的事情?

# Sync to the latest SVN
git svn fetch
# Rebase "master" which is tracking the remote SVN ^/trunk
git checkout master
git svn rebase

# Checkout the local_feature_branch
git checkout local_feature_branch

# Merge "master" into "local_feature" which is tracking ^/trunk
git merge --squash master
git commit -m "merge master which is tracking SVN ^/trunk"

# Dry run the dcommit to SVN which should include svn:mergeinfo property changes
git svn dcommit --dry-run

# Commit merge to trunk
git svn dcommit 

1 个答案:

答案 0 :(得分:20)

merge --squash svn.pushmergeinfo 一起使用没有多大意义。使用merge --squash,生成的提交将不是合并提交,因此后续的 dcommit 将不会创建任何mergeinfo。

我知道stackoverflow上的(主要是较旧的)线程建议使用--squash,但我认为这在很大程度上是过去的遗留物。我已经使用git-svn来管理我们公司的svn repos近一年了,到目前为止,它在以下工作流程中运行良好:

我总是在合并之前确定我是最新的,为了安全起见,我没有任何本地未同步的提交:

# On local_feature_branch
# Update from SVN
git svn fetch && git svn rebase -l

# push pending commits
git svn dcommit

然后我使用“远程”SVN分支作为源进行“真正的”合并。这样可以节省切换分支和更新,并确保传入分支没有任何本地未同步的提交:

# Create a real, non-forward merge commit
git merge --no-ff svn/trunk

# ... and push it to SVN, including mergeinfo
git svn dcommit

此外,这种方式合并会在本地历史记录中正确记录,因此后续合并不必处理以前解决的冲突。随着--squash,你会在每次合并时重新开始。

但请注意,当从local_feature_branch合并回trunk(即svn-speak中的重新集成)时,mergeinfo存在一个未解决的问题:Git-SVN with svn.pushmergeinfo: how to avoid self-referencing mergeinfo lines。这在我们的回购中很少发生,但到目前为止它并没有给我带来任何麻烦。

相关问题