git-svnには、cherry-picked コミットに関連する深刻な問題がありました。
すでに svn リポジトリにコミットされているコミットa1b2c3f9があるとします。
$ git show a1b2c3f9
commit a1b2c3f9...
Author: Happy Dev <happyd@43fe5c0-...>
Date: Mon Nov 14 13:01:38 2011 +0000
Commit message
git-svn-id: https://host/svn/branches/some-branch@1000 43fe5c0-...
このgit-svn-id行を参照してください。これは、git-svnがコミットが Subversion リポジトリのどこにあるかを理解する方法です。
ここで、現在使用しているマスターブランチにこのコミットをチェリー ピックします。
$ git cherry-pick a1b2c3f9
マージの競合がなければ、git は新しいコミット、たとえば9f3c2b1aを作成します。
$ git show 9f3c2b1a
commit 9f3c2b1a...
Author: Happy Dev <happyd@43fe5c0-...>
Date: Mon Nov 14 13:01:39 2011 +0000
Commit message
git-svn-id: https://host/svn/branches/some-branch@1000 43fe5c0-...
そのため、Git はまったく同じメッセージでコミットを作成しました。これは深刻な問題を引き起こしました。以前のバージョンのgit-svnは、そのようなコミットを間違ったブランチ( ^/trunk/ではなく^/branches/some-branch ) に送信していました。
この問題は、Git の最新バージョンでは既に修正されています。しかし、まだ存在する別のものがあります:
git-svnは、Subversion のマージ追跡メカニズムを尊重しません。
Subversion トラックは、実行されたチェリー ピックに関する情報をマージするため、コマンド
$ svn merge -c 1000 ^/branches/some-branch trunk-working-copy
次のように、 trunk-working-copyのsvn:mergeinfoプロパティを調整します。
+ /branches/some-branch: 1000
このようにして Subversion は、この特定のリビジョンが既に^/trunk/ブランチにマージされていることを理解し、それ以降のマージでこの変更をスキップします。
実行するgit cherry-pick
と、 Subversion リポジトリはsvn:mergeinfo のgit svn dcommit
変更を取得しません。
免責事項は次のとおりです。現在、私はSmartGit
に取り組ん
でいませんが、SmartGit 開発者と緊密に連携して働いています。
Syntevo社は、 git-svnの優れた代替品であるSmartGitを開発しました。この Git クライアントは、上で説明したすべての問題を解決します。
したがって、a1b2c3f9コミットをチェリーピックします。
$ git cherry-pick a1b2c3f9
その結果、9f3c2b1aコミットを取得し、それを Subversion リポジトリにプッシュします。SmartGit はマージ追跡情報を保持するためにあらゆることを行うため、^/trunk/ブランチはsvn:mergeinfoプロパティの必要な変更を取得します。
+ /branches/some-branch: 1000
SmartGit 自体から、または Git コマンド ライン インターフェイスを使用して、Git のチェリー ピックを実行できます。2 番目のケースでは、コミット メッセージに、cherry-pick ソースのgit-svn-id行が含まれている必要があります。
SmartGit はプロプライエタリ ソフトウェアですが、非商用の場合は無料です。多くの優れた機能があります。詳細については、 SmartGit のドキュメントを参照してください 。
git-svnに関する特定の問題を解決する別の興味深いプロジェクト— SubGit があります。基本的に、これは Subversion リポジトリと Git リポジトリの間で変更を同期するためのサーバー側のソリューションです。git-svnよりはるかに優れており、問題はありません。
svn-via-git ユーザーとして、あなたもそれに興味があるかもしれません。