私はGitの「移植片」とは何かを理解しようとしています。
たとえば、最新のコメントの1つ ここ で、Tobuは使用すると想定しています git-filter-branch そして .git/info/grafts 2つのリポジトリに参加します。
しかし、なぜこれらの移植片が必要なのかわかりませんか?最後の2つのコマンドがなくてもすべてが機能するようです。
から Git Wiki :
グラフトポイントまたはグラフトにより、2つの異なる開発ラインを結合できます。これは、ユーザーがコミットの偽の祖先情報を記録できるようにすることで機能します。このようにして、コミットが持っている親のセットが、コミットが作成されたときに記録されたものとは異なるふりをgitにさせることができます。
グラフトを使用する理由
グラフトは、別のSCMからインポートされた古い履歴のクローン作成をオプションにすることができるため、開発をgitに移行するときに役立ちます。これにより、開発者が完全な開発履歴を利用できるようにしながら、最新バージョンをフォローしたいだけのユーザーの初期クローンが保持されます。
Linusがカーネルツリーを維持するためにgitを使い始めたとき、古いカーネル履歴を変換するツールはありませんでした。その後、古いカーネル履歴がbkcvsゲートウェイからgitにインポートされたときに、2つの異なるリポジトリを結び付けることを可能にする方法としてグラフトが作成されました。
Git-svnを使用する場合:
gitグラフトは、GitツリーをSubversionリポジトリにインポートするのに非常に便利です。
例えば。まず、ローカルのGitリポジトリを作成しました。数日間作業し、多くのコミットを作成した後、中央のSubversionリポジトリに公開する必要があり、履歴を失いたくありませんでした。
次のハウツー記事を見つけました: http://eikke.com/importing-a-git-tree-into-a-Subversion-repository/
グラフトアプローチ 言及 by Chris Johnsen 2つのリポジトリを結合することはもはや有効ではありません完全に(グラフトのみの場合)。
Git 2.18(2018年第2四半期)では、「$GIT_DIR/info/grafts
」の機能が「refs/replace/
」メカニズムに置き換えられました(しばらくの間)。
内部コードは多くの場所でサポートされていましたが、「移植」メカニズムのサポートを終了するためにクリーンアップされました 。
commit a3694d9 、 commit f42fa47 、 commit 8d0d81a 、 commit e2d65c1 、 commit f9f99b を参照してください。 、 commit 0115e 、 commit fb40429 、 commit 041c98e 、 commit e24e871 (28 Apr 2018)、および commit d398f2e 、 commit fef461e 、 commit 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 829a321 、 commit 5cef295 、 commit 20fd6d5 、 commit d653824 、 commit b775896 を参照してください。 、 commit 950c62b (2018年8月20日)by Derrick Stolee(derrickstolee
) 。
commit 212e0f7 、 commit 4a6067c (20 Aug 2018)by Stefan Beller(stefanbeller
) を参照してください。
( Junio C Hamano --gitster
- in commit 6d8f8eb 、2018年10月16日