3

別のgitの質問...私は次の状況にあります:

A1 ---- B1 ---- C1
                   \
                    > D ---- E ---- F
                   /
A2 ---- B2 ---- C2

{A1,B1,C1} と {A2,B2,C2} には共通のファイルがありません(2 つの異なるリポジトリをマージした結果であるため、現在 2 つのルートがあります)

履歴書はこんな感じでお願いします

A1 ---- B1 ---- C1 ---- A2 ---- B2 ---- C2 ---- D ---- E --- F

しかし、git-rebaseでそれを行う方法がわかりません。何か考えはありますか?

ボーナス:手動で行うことなく、タグ(3つのブランチすべてにある)を保持できれば...

4

2 に答える 2

3

私は次の2つのコマンドを順番に使用してそれを行うことができました。

git filter-branch -f --parent-filter 'test $GIT_COMMIT = <a2> && echo "-p <c1>" || cat'
git filter-branch -f --parent-filter 'test $GIT_COMMIT = <new head> && echo "-p <c2>" || cat'

もちろん、、などを対応するコミットハッシュに置き換える必要が<a2>あります<c1><new head>ヘッドのハッシュは最初のコマンドの後で変更されることに注意してください。そのため<new head>、単に。ではなく、ヘッドを呼び出しました<d>

実際には非常に簡単です。最初のコマンドは、C1をA2の親として設定します。2番目のコマンドは、C2をDの唯一の親として設定することにより、グラフを修正します。

于 2012-06-28T00:22:32.323 に答える
1

わかりました、私はそれを行う方法を考え出しました。それはgitの内部構造の理解に大きく貢献するので、ここで詳細な回答をします:

最初に、以前はなかったので、A2 に新しい親を与える必要があります。

git cat-file commit A2

「親が表示されない」要約を生成します。行を作成し、新しいハッシュを作成します。

git cat-file commit A2 | sed -e '2aparent C1' | git hash-object -t commit -w --stdin

これにより、出力としてハッシュ {H1} が得られます。これを使用して、A2 をこの新しいハッシュに置き換えます。

git replace A2 H1

出来上がり、A2 は C1 を親として持つようになりました。しかし今、歴史は次のようになります。

A1 ---- B1 ---- C1 --------------------- D ----- E ----- F
                  \                     /
                     A2 ---- B2 ---- C2

2 つの親 (C1 と C2) を持つ D にも同じことを行います。

git cat-file commit D

C1 に対応する「親」行を削除し、ハッシュして、次のように置き換えます。

H2=`git cat-file commit D | sed -e '/parent C1/d' | git hash-object -t commit -w --stdin`
git replace D H2

それは私のために働いたようです。私が何をしたかをよく理解していれば、両方のリポジトリに異なるファイルがあったため、これはうまくいきました。Dでマージされた両方のリポジトリに共通のファイルがあると、問題が発生する可能性があると思います.

于 2012-06-28T00:07:28.163 に答える