11

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

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

配置键:svn.pushmergeinfo

此选项将导致 git-svn 尝试在可能的情况下自动填充 SVN 存储库中的 svn:mergeinfo 属性。目前,这只能在 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 
4

1 回答 1

20

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

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

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

# 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 合并回主干时,mergeinfo 存在一个未解决的问题(即在 svn-speak 中重新集成):Git-SVN with svn.pushmergeinfo: how to Avoid self-referencing mergeinfo lines。这在我们的回购中很少发生,但到目前为止它并没有给我带来任何麻烦。

于 2012-06-20T10:36:19.670 回答