5

SVN リポジトリのブランチを管理するために git-svn を使用しています。次の問題に直面しています。ユーザー X がブランチで何度もコミットした後、ユーザー Y は git-svn を使用してブランチの変更をトランクにマージしたいと考えています。私たちが目にしている問題は、すべての個々のマージ操作のコミット メッセージがユーザー Y によって行われたかのように見えるのに対し、ブランチの実際の変更はユーザー X によって行われたことです。

マージ時に、マージを行っている人ではなく、特定の変更に対して元のコミット メッセージ/作成者を使用することを git-svn に示す方法はありますか?

4

3 に答える 3

13

git-svn の man ページでは、merge を使用しないことを推奨しています。""git-svn fetch and rebase (プルやマージではなく) を実行することをお勧めします"". そうは言っても、あなたは好きなことをすることができます:-)

ここには 2 つの問題があります。まず、svn はcommiterのみを格納し、git のようにパッチの作成者を格納しないことです。したがって、Y がマージをトランクにコミットすると、たとえパッチが X によって作成されたとしても、svn は彼女の名前だけを記録します。道を下って。

第二に、git は比較的新しい svn マージ機能を使用していないようです。git は活発に開発されており、常に新しい機能が追加されているため、これは一時的なものかもしれません。しかし、今のところ、それらを使用していません。

git 1.6.0.2 で試したところ、svn merge で同じ操作を行う場合と比較して情報が「失われます」。svn 1.5 では、ログと注釈のメソッドに新しい機能が追加されたため、トランクの svn log -g はマージのために次のようなものを出力します:

------------------------------------------------------------------------
r5 | Y | 2008-09-24 15:17:12 +0200 (Wed, 24 Sep 2008) | 1 line

Merged release-1.0 into trunk
------------------------------------------------------------------------
r4 | X | 2008-09-24 15:16:13 +0200 (Wed, 24 Sep 2008) | 1 line
Merged via: r5

Return 1
------------------------------------------------------------------------
r3 | X | 2008-09-24 15:15:48 +0200 (Wed, 24 Sep 2008) | 2 lines
Merged via: r5

Create a branch

ここで、Y は r5 をコミットし、ブランチの X からの変更をトランクに組み込みます。ログのフォーマットはそれほど素晴らしいものではありませんが、svn Blame -g で独自のものになります:

       2          Y int main()
       2          Y {
G      4          X   return 1;
       2          Y }

ここで、Y がトランクにのみコミットすると仮定すると、1 行が (ブランチで) X によって編集され、マージされたことがわかります。

したがって、svn 1.5.2 を使用している場合は、今のところ実際の svn クライアントとマージした方がよいでしょう。git ではマージ情報が失われますが、通常は文句を言わないほど賢いです。

更新: git 1.7.1 でこれを試して、その間に進歩があったかどうかを確認しました。悪いニュースは、git 内のマージはまだ svn:mergeinfo の値を設定git mergeしないため、続いてgit svn dcommitsvn:mergeinfo が設定されず、Subversion リポジトリが正規のソースである場合はマージ情報が失われることです (おそらくそうです)。良いニュースはgit svn clone、より良いマージ履歴を構築するために svn:mergeinfo プロパティを読み込むことです。そのため、svn merge正しく使用すれば (完全なブランチをマージする必要があります)、git クローンは git ユーザーには正しく見えます。

于 2008-09-24T13:48:49.767 に答える
6

グラフトを使用して、問題のコミットオブジェクトに示されていないマージについてgitに教えることができます。

echo "$merge_sha1 $parent1_sha1 $parent2_sha1" >> .git/info/grafts

この情報を見つけるのは簡単です。問題のマージコミットを見つければ$merge_sha1$parent1_sha1すでに知っています。従来、このようなコミットのコミットメッセージには、2番目の親コミットのSVNリビジョン番号が含まれています。これは、対応するコミットIDに変換するだけです。

git svn find-rev r$revnum $branch

Prestoには、グラフトを作成するために必要な3つの情報がすべて揃っています。

于 2008-09-24T14:11:10.413 に答える
2

--add-author-from および --use-log-author オプションを git-svn に使用してみてください。

于 2009-08-20T18:27:48.230 に答える