5

安定したトランクと不安定な開発ブランチを備えた SVN セットアップがあります。開発作業は (ほとんど) ブランチで行われ、展開前にトランクにマージされます。

SVN クライアントとして git-svn を使用しています。不安定版からトランクへのマージ プロセスは次のとおりです。

git svn fetch
git co -b trunk svn/trunk 
git merge --no-ff svn/unstable
git svn dcommit

svn/*リモート SVN ブランチです。

これはもちろん、私が完了する前に誰もトランクに何もコミットしないことを必要としますが、これは実際には問題ではありません。

このプロセスの利点は、git がマージ コミットの親をローカル リポジトリに記録するようになったことです。これは私の同僚には何のメリットもありませんが、マージを行うときにgit が共通の祖先を計算できるようにします。これは非常に望ましいことです。

そして、ここに摩擦があります。他の誰かがマージを行っても、git はそれを知りません。次に例を示します。

  o-...-A---o---C--- unstable
 /
X--...--B---o---o--- stable

不安定なブランチはポイント X で作成されました。ポイント A で、不安定なブランチからの変更をポイント B の安定したブランチにマージすることにしました。共通の祖先は正しく X です。

マージは git 履歴に記録されていないため、次の C でのマージでは、X が共通の祖先であると想定しています。次のグラフのように、A にしたいと思います。

  o-...-A---o---C--- unstable
 /       \
X---...---B---o---o--- stable

描かれているものとまったく同じように見えるグラフを取得することは絶対に必要というわけではありません. A を共通の祖先として認識する任意のグラフは、私には問題ありません。

git-filter-branch の適切な使用や、SVN に決してコミットされない「偽の」コミットなど、いくつかのオプションを念頭に置いています。しかし、これまでのところ、私の試みはどれも十分に機能していません。

あなたが提示できるアイデアに感謝します。手順は自動である必要はありません。マージは非常にまれであり、「手動で」実行するという苦痛に耐えることができます。

4

4 に答える 4

2

追加の代替手段は、Grafts ファイルを使用することです。これにより、実際に履歴を操作することなく、コミットの親をオーバーライドできます。

これは、SVN リポジトリでマージを確認した後、マージ コミット (M) とその親 (A、B) の SHA-1 を含む行を .git/info/grafts に追加するだけでよいことを意味します。

      o-...-A---o---D--- unstable
     /       
    X-----B---M---o---o--- stable

A = 31423cd8a838f984547a908777308d846043cbda
B = d99cfccb1f859a8f1dbfac95eec75227fe518b23
M = 13319a54d3e3d61b501e7cc6474c46f37784aaa3

AM からリンクを作成するには、M の親を B と A として指定します。接ぎ木ファイルの形式はかなり単純です。

commit newparent1 ... newparentN

これは、移植ファイルに次の (かなり長い) 行を追加することを意味します。

13319a54d3e3d61b501e7cc6474c46f37784aaa3 d99cfccb1f859a8f1dbfac95eec75227fe518b23 31423cd8a838f984547a908777308d846043cbda

Git は、このマージが実際に行われたかのように見せかけます。欠点として、これは git push/fetch/clone を介して伝播されませんが、これは個人的な開発にとって大きな問題にはなりません。

于 2009-07-19T11:21:36.237 に答える
2

あなたの問題は、逆にgit マージからSVNsvnmergeinfo
を取り込むようなものです: SVN が Git からのマージを記録するのではなく、Git が SVN からのマージを記録するようにしたい;)

git-svnSVN からのインポート時に属性を気にしないためsvnmergeinfo、「手動操作」オプションが残されています。

git-filter-branchGit 側で履歴を書き換えるソリューションなどはお勧めしません。
SVN での " " マージを認識している場合はA->B、Git ** で " " マージ" ブランチでそのマージを実行し、それを安定したブランチにマージして (この時点では単純なマージ)、新しいブランチを追加する必要があります。現在の安定した履歴にコミットします。

    o-.....-A---o---C--- unstable
   /         \
  /           o-------\__ merge recorder branch
 /           /         \
X---.....---B---o---o---o__ stable

次に、C から安定版へのマージでは、A を共通の祖先として持つ必要があります。

于 2009-06-02T06:24:37.717 に答える
1

git 1.6.6 以降、これは自動的に行われるはずです。

" * "git svn" は SVN 1.5+ と SVK マージ チケットの読み取りを学習しました。"

の:

http://www.kernel.org/pub/software/scm/git/docs/RelNotes/1.6.6.txt

于 2010-12-16T12:05:57.900 に答える
0

グラフトファイルに注意してください。

  1. それらを間違えると、git gc は (しばらくすると) 履歴の一部を削除します
  2. 別のホストにプッシュすると、ホストはグラフトを認識せず、履歴が壊れてしまう可能性があります。
于 2009-07-22T18:42:55.450 に答える