2012-06-19 13 views
9

git-svnを使用してsvn追跡ブランチをマージする正しいワークフローは何ですか?私は、について少し読んだのgit-svnの設定キーsvn.pushmergeinfo、及び注意事項は次のとおりです。git-svn svn.pushmergeinfoを使用したマージのワークフロー

http://www.kernel.org/pub/software/scm/git/docs/git-svn.htmlから:

設定キー:gitの原因となります。このオプション

svn.pushmergeinfo -svn〜 可能であれば、 SVNリポジトリ内のsvn:mergeinfoプロパティを自動的に設定しようとします。現在のところ、 が最初の を除くすべての親が既にSVNにプッシュされている非早送りマージを非コミットする場合にのみ、これを行うことができます。

だから私の通常のワークフローは次のとおりです。

は私local_feature_branchに^ /トランクをマージし、私はその後、SVNブランチ^ /支店/ 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 

を持っていると仮定すると、私はのような何かをすると仮定?

# 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

妥当と思われます。何について質問がありますか? –

答えて

19

svn.pushmergeinfoが一緒にあまり意味がありません--squash マージを使用しました。 merge --squashでは、結果として得られるコミットはマージコミットではないので、その後のdcommitはmergeinfoを作成しません。

ここでstackoverflowのスレッドは--squashを使用するように提案していますが、これは主に過去の遺物だと思います。私はgit-svnを使ってsvn reposを1年近く管理してきましたが、それまでは以下のワークフローでうまくいきました:

私は常に最新のマージそして、ちょうど私が任意のローカル同期されていないコミットしていないことが、安全のために:

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

# push pending commits 
git svn dcommit 

を次にI「本物」をソースとして「リモート」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の再統合):Git-SVN with svn.pushmergeinfo: how to avoid self-referencing mergeinfo linesにマージする際に、mergeinfoに未解決の問題があります。これは私たちのレポではめったに起こっていませんが、これまでのところ私にとっては何のトラブルも生じませんでした。

+0

機能ブランチをトランクにマージするときに、自己参照mergeinfoの回避​​に関する詳細はありますか? – Dougnukem

+0

いいえ、これまでのところ私は問題を無視してこの問題を無視しました。いくつかのsvnクライアントに問題があるかもしれないのかどうかは分かりませんが、これまでgit-svn、コマンドラインsvn、Eclipse Subversiveで問題は発生していませんでした。(私もTortoise SVNと思います) – Carsten

+0

** EDIT ** [link](http://thread.gmane.org/gmane.comp.version-control)で詳細な説明を読んでください。git/191932)、これはおそらく私たちに当たったことはありませんでした。なぜなら、gitでその時起こったすべての(まれな)再統合マージを行ったからです。 – Carsten

関連する問題