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プロパティに自動的にデータを入力しようとします。現在、これは、最初の親を除くすべての親がすでにSVNにプッシュされている非早送りマージをコミットする場合にのみ実行できます。

したがって、私の通常のワークフローは次のとおりです。

私がSVNブランチを持っていると仮定します^/branchs / 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はmergeinfoを作成しません。

ここにあるstackoverflowの(ほとんどの場合古い)スレッドは--squashの使用を示唆していることを私は知っていますが、それは主に過去の遺物だと思います。私はgit-svnを使用して、会社のsvnリポジトリを1年近く管理してきましたが、これまでのところ、次のワークフローでうまく機能しました。

マージする前に、常に最新であることを確認し、安全のために、ローカルの同期されていないコミットがないことを確認します。

# 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からトランクにマージする場合(つまり、svn-speakで再統合する場合)、mergeinfoには未解決の問題があることに注意してください。Git -SVNとsvn.pushmergeinfo:自己参照mergeinfo行を回避する方法。これは私たちのリポジトリではめったに起こりませんが、これまでのところ私にとっては何の問題もありませんでした。

于 2012-06-20T10:36:19.670 に答える