web-dev-qa-db-ja.com

.git / info / graftsは何のためにありますか?

私はGitの「移植片」とは何かを理解しようとしています。

たとえば、最新のコメントの1つ ここ で、Tobuは使用すると想定しています git-filter-branch そして .git/info/grafts 2つのリポジトリに参加します。

しかし、なぜこれらの移植片が必要なのかわかりませんか?最後の2つのコマンドがなくてもすべてが機能するようです。

47

から Git Wiki

グラフトポイントまたはグラフトにより、2つの異なる開発ラインを結合できます。これは、ユーザーがコミットの偽の祖先情報を記録できるようにすることで機能します。このようにして、コミットが持っている親のセットが、コミットが作成されたときに記録されたものとは異なるふりをgitにさせることができます。

グラフトを使用する理由

グラフトは、別のSCMからインポートされた古い履歴のクローン作成をオプションにすることができるため、開発をgitに移行するときに役立ちます。これにより、開発者が完全な開発履歴を利用できるようにしながら、最新バージョンをフォローしたいだけのユーザーの初期クローンが保持されます。

Linusがカーネルツリーを維持するためにgitを使い始めたとき、古いカーネル履歴を変換するツールはありませんでした。その後、古いカーネル履歴がbkcvsゲートウェイからgitにインポートされたときに、2つの異なるリポジトリを結び付けることを可能にする方法としてグラフトが作成されました。

36
Oli

Git-svnを使用する場合:

gitグラフトは、Gitツ​​リーをSubversionリポジトリにインポートするのに非常に便利です。

例えば。まず、ローカルのGitリポジトリを作成しました。数日間作業し、多くのコミットを作成した後、中央のSubversionリポジトリに公開する必要があり、履歴を失いたくありませんでした。

次のハウツー記事を見つけました: http://eikke.com/importing-a-git-tree-into-a-Subversion-repository/

8
Martin Gross

グラフトアプローチ 言及 by Chris Johnsen 2つのリポジトリを結合することはもはや有効ではありません完全に(グラフトのみの場合)。
Git 2.18(2018年第2四半期)では、「$GIT_DIR/info/grafts」の機能が「refs/replace/」メカニズムに置き換えられました(しばらくの間)。
内部コードは多くの場所でサポートされていましたが、「移植」メカニズムのサポートを終了するためにクリーンアップされました 。

commit a3694d9commit f42fa47commit 8d0d81acommit e2d65c1commit f9f99b を参照してください。 、 commit 0115ecommit fb40429commit 041c98ecommit e24e871 (28 Apr 2018)、および commit d398f2ecommit fef461ecommit c5aa6db (25 Apr 2018)by Johannes Schindelin(dscho
Junio C Hamano --gitster- in commit 352cf6c 、2018年5月23日)

だから代わりに

echo "$commit-id $graft-id" >> .git/info/grafts

あなたは今します:

git replace --graft $commit-id $graft-id
git filter-branch $graft-id..HEAD

.git/info/graftsの非推奨サポート

移植機能は、古代の歴史をlinux.gitの新たな始まりに「つなぎ合わせる」ための便利な方法でした。

ただし、その実装はGitの標準に達していません。これは、意外で望ましくない動作につながる可能性のある方法が多すぎるためです。

たとえば、アクティブなグラフトがあるリポジトリからプッシュする場合、「グラフトアウト」されたコミットを見逃して、反対側で壊れた状態になる可能性があります。

また、グラフト機能は、コミットの親のリストを「書き換える」ことに限定されており、他のものを置き換えることはできません。

git replaceとして実装されたはるかに若い機能は、これらの制限と危険なバグを修正するために着手しました。

git replaceは今ではかなり成熟しているように見えます( 4228e8b (replace:add --graft option、2014-07-19、Git 2.1.0)以降、グラフトファイルを実行できます義務)、グラフトファイルのサポートを廃止し、最終的には廃止する時が来ました。

今(再び、Git 2。18、2018年第2四半期)、あなたは持っています:

replace--graftオプションを追加

このオプションの使用文字列は次のとおりです。

git replace [-f] --graft <commit> [<parent>...]

まず、親が<commit>であることを除いて、[<parents>...]と同じ新しいコミットを作成します。

次に、作成したコミットに置き換える置換参照を作成します。

この新しいオプションを使用すると、移植片を変換して参照を置き換えるのは簡単です。


また、Git 2.20(2018年第4四半期)より前は、最近導入されたコミットグラフの補助データは、オブジェクト参照関係の不変の性質を「壊す」replace&graftsなどのメカニズムと互換性がありません。
これらの互換性のない機能がリポジトリで使用されている場合、その使用(および既存のコミットグラフの更新)に基づいて最適化を無効にします。

commit 829a321commit 5cef295commit 20fd6d5commit d653824commit b775896 を参照してください。 、 commit 950c62b (2018年8月20日)by Derrick Stolee(derrickstolee
commit 212e0f7commit 4a6067c (20 Aug 2018)by Stefan Beller(stefanbeller を参照してください。
Junio C Hamano --gitster- in commit 6d8f8eb 、2018年10月16日

8
VonC