3

私は、複製されて壊された2つのリポジトリ履歴を持っている状況があります(SVNの周りの相互作用と移行を介して-私の選択ではありません)。同じ一時保守リポジトリにリモートとして両方のリポジトリがあります。それらは数百のコミットに相当する履歴を共有し、その後、「古い」コミットはいくつかのブランチでさらに数十の間続きます。「新しい」ツリーを古いツリーの状態まで早送りする必要があります。ただし、マングリングのため、同じ内容であるにもかかわらず、同じツリーとして認識されません。

gitに「著者が異なっていても、これら2つのコミットは同一です」(著者IDは翻訳で混乱していました)と伝える方法が欲しいのですが。可能であれば、2つのリモートツリーをトラバースして、同じコンテンツを持つすべてのノードに対してその関連付けを行うことができればと思います。これは、両方に手動で「コミット1」のマークを付けて、残りを実行できることを意味します。それ以外の場合は、すべての分岐のルートを手動でマークする必要があります(それほど悪くはありませんが、そうでない方がよいでしょう)。

グラフトポイントを使用してみましたが、これはほぼ私が望むものです。gitkは私が望むものを示していますが、メイン(新しい)リポジトリにプッシュバックすると、数百の重複するコミットに沿ってドラッグされました。まだマージされていない子ノードに対して実行する必要があるため、実行するのも少し面倒です。

https://stackoverflow.com/a/973403/372757を見つけて、それが機能すると思います。ブランチごとに1回、古いコミットを新しいリポジトリにリベースするだけで済みます。

それでも、元のリクエストが可能かどうかを知りたいと思います。

4

2 に答える 2

4

git「同一のコミット」が何であるかについてかなり厳密な定義がありますが、それはおそらくあなたが考えているものとは一致しません。同一のコミットであるためには、次のすべてが真である必要があります。

  1. コミットされるツリー内のすべてのファイルは、新しいコミット(つまり現在のHEAD)の親になるコミット内の同じファイルとバイト単位で同一である必要があります
  2. 新しいファイル、削除されたファイル、再編成はありません。ツリーのSHA1は、ツリーに含まれるファイルとサブツリーに依存するため、ツリーは完全に一致する必要があります。ツリー上のリーフが異なる場合、最上位ツリーのSHA1は異なります。
  3. まったく同じ作成者とコミッターの名前と電子メールの値
  4. まったく同じ作成者とコミット日
  5. 新しいコミットの親になるHEADの現在の値とまったく同じ
  6. まったく同じコミットメッセージ
  7. おそらく私が見逃している他のいくつかの詳細

これらはすべて、新しいコミットのSHA1ハッシュを生成する際に直接的または間接的に使用されるため、真に同一でない限り、コミットは同一にはなりません。

そうは言っても、新しいコミットを生成するときに、特定のファイルまたはツリーがデータベースにすでに存在するオブジェクトとバイト単位で同一である場合、別のコミットにそれらが含まれていたため、おそらくあなたの質問のポイントにもっと思いますまったく同じ状態にある場合、新しいコミットはそれらの既存のオブジェクトを指します-それらは再び保存されません。

2つのブランチで異なる作成者情報のみの場合(ファイルの内容が別のブランチと完全に一致している場合でも、コミットのシーケンスが異なります)、ブランチを使用git filter-branchまたはgit rebase書き換えて、情報を修正することができますが、まったく新しいコミットのセットになります(ただし、コミットメッセージ、時間、または作成者/コミッター名以外を変更しないと、すべてのツリーとファイルオブジェクトが同じままになる可能性があります)。ただし、他の作業(自分自身または他の人による)がすでに既存のブランチに基づいている場合は、そのような変更を行う際にかなりの量のクリーンアップが必要になる可能性があることに注意してください。

于 2012-11-02T20:31:55.937 に答える
1

あなたの問題は、コミットの平等を再定義することです。コミットの関連情報を試してフィルタリングする必要があるgit cat-fileと思います。grep樹木限界線で十分かもしれませんが(たとえばgit cat-file commit <COMMIT_ID> | grep "tree")、親の木も含めるとよいと思います(コミットのIDだけでなく、異なるため)。

この等式関数を取得しgit rev-listたら、レポを作成し、それらを重複して検索する必要があると思います。

于 2012-11-02T22:45:14.147 に答える