32

私はgit-svnを評価しており、特定のsvnリポジトリでどれだけうまく機能するかを判断しようとしています。私は主に、svn:mergeinfoプロパティがSubversionリポジトリで正しく設定されるようにgit-svnにマージを実行させることに関心があります。これは可能ですか?

これが私がこれまでにしたことです:

# Checkout the SVN repo.
$ git svn clone svn://server/project1 -T trunk -b branches -t tags

# Make sure we are working on trunk.
$ git reset --hard remotes/trunk

# Modify the working copy.
$ vim file.txt

# Commit locally to the git repo.
$ git commit -a

# Push the commits back to the SVN server.
$ git svn dcommit
Committing to svn://server/project1/trunk ...
    M   file.txt
Committed r178
    M   file.txt
r178 = b6e4a3a0c28e7b9aa71d8058d96dcfe7c8a2b349 (trunk)

では、その特定のコミットをSubversionブランチの1つにマージするにはどうすればよいでしょうか。繰り返しますが、変更をコミットするときにgitがsvn:mergeinfoプロパティを適切に設定することは私にとって非常に重要です。

4

4 に答える 4

52

これは古い質問ですが、git-svn に関する現在の状況は、質問されてから変わりました。具体的には、git 1.7.5 では、svn に dcommit するときに svn:mergeinfo を設定するための制限付きサポートがあります。

git svn dcommit-mergeinfo=<mergeinfo>フラグを受け入れるようになりました。1.7.5+の man ページから引用するには:

-mergeinfo=<マージ情報>

dcommit 中に指定されたマージ情報を追加します (例: --mergeinfo="/branches/foo:1-10")。すべての svn サーバー バージョンはこの情報を (プロパティとして) 保存でき、バージョン 1.5 以降の svn クライアントはそれを利用できます。git svn は現在それを使用せず、自動的に設定しません。

ただし、これを使用するときは非常に注意する必要があります。マニュアルページには「追加」と書かれていますが、実際の意味は「置換」です。つまり、svn:mergeinfo属性は渡されたものに基づいて設定され、指定されたリビジョンを既存の に追加しませんsvn:mergeinfo。私の過ちから学ぶ…</p>

編集:

彼らはまだこれをさらに改善するために取り組んでいるようです. git-svn 1.7.7の時点で、次のテキストが git-svn man ページに追加されました。

設定キー: svn.pushmergeinfo

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

于 2011-05-12T19:48:26.963 に答える
12

簡単な答え: いいえ、git-svn は svn:mergeinfo プロパティを気にしません。git-svn は svn へのマージを行っていない (コミットを行っている) からです。

長い答え: ほとんどの人は git-svn を使用して、svn のマージが脳に損傷を与えた状態から抜け出します。svn の問題は、「svn copy」コマンドを使用してブランチまたはタグを作成するため、ファイルまたはフォルダーのコピー (多くの場合、リファクタリングが原因) とブランチの作成を区別しないことです。svn:mergeinfo プロパティはこの問題の応急処置ですが、変更があいまいな場合がまだあります。Git では、分岐とマージがより強力にサポートされています。

于 2009-05-12T19:27:00.170 に答える
6

彼らはそれに取り組んでいるようです。次のバージョンで可能になるかもしれません:

http://git.kernel.org/?p=git​​/git.git;a=commit;h=6abd9332f97441a568421ba233ad8929b50a7efc

于 2010-12-16T11:55:54.090 に答える
1

理論上の部分

問題は、Subversion と Git のマージ追跡メカニズムが大きく異なることです。

その結果、特定のマージ情報を Subversion から Git に正しく変換できません。たとえば、SVN がサブディレクトリ レベルでさえチェリー ピックを追跡する場合、Git はチェリー ピックをまったく追跡しません。

一方、Subversion での Git マージ履歴の表示には問題はありません。ただし、いくつかの SVN ファイル/ディレクトリ プロパティは Git リポジトリに存在しないため (svn:keywords など)、マージ コミットをコミットすると、これらのプロパティの変更は SVN リポジトリで失われます。

実用部

git-svn は、Git コミットのすべての親に従って svn:mergeinfo プロパティを自動的に設定しません。ただし、対応するコミットをコミットする前に、プロパティの値を手動で指定できます。

git-svn のサーバー側の代替であるSubGitをご覧ください。可能であれば、マージ情報を両方向に変換します。また、svn:ignore、svn:eol-style、svn:mime-type などの SVN プロパティもサポートしています。

詳細については、SubGit のドキュメントSubGit と git-svn の比較を参照してください。

SubGit は、オープンソース、アカデミック、および小規模プロジェクト向けの無料オプションを備えた商用製品です。私は SubGit 開発者の 1 人です。

于 2012-09-10T17:59:43.457 に答える