Gitに変換しているMercurialリポジトリがあります。コミット履歴は非常に大きく、新しいリポジトリにすべてのコミット履歴が必要なわけではありません。コミット履歴をGitに変換したら(そして新しいリポジトリにプッシュする前に)、特定のタグの前にあるすべてのコミットを1つのコミットに押しつぶしたいと思います。
だから、私が持っている場合:
commit 6
commit 5
commit 4
commit 3
commit 2
commit 1 -- First commit ever
私は最終的にしたい:
commit 6
commit 5
commit X -- squashed 1, 2, 3, 4
注:押しつぶす必要のあるコミットは何千もあります。したがって、それらを1つずつ手動で選択/マークすることはオプションではありません。
これまでの他の回答はリベースを示唆しています。これは、Gitに変換されたリポジトリのコミットグラフによっては、機能する場合があります。新しいファンシーなリベース--rebase-merges
は間違いなくそれを行うことができます。しかし、それはそれを回避するための一種の不器用な方法です。これを行う理想的な方法は、保持したい最初のコミットから開始してコミットを変換することです。つまり、MercurialエクスポーターをGitにエクスポートします。これは、Gitの最初のコミットとして、ふりをしたいリビジョンがルートです。Mercurialエクスポーターに、そのコミットの子孫を一度に1つずつインポーターにエクスポートしてもらいます。これは、エクスポーターが常にこのジョブを実行するのと同じ方法です(どのような方法でも)。
これを実行できるかどうか、および実行する方法は、変換に使用しているツールによって異なります。(私は実際にこれらの変換を行っていませんが、ほとんどの人が使用hg-fast-export
しているようですgit fast-import
。内部の詳細についてはあまり調べていませんが、hg-fast-export
これができなかった明確な理由はありません。)
基本的に(内部的に)、Mercurialストアはチェンジセットとしてコミットします。これはGitには当てはまりません。Gitは代わりにスナップショットを保存します。ただし、Mercurialは必要に応じてチェンジセットを合計することでスナップショットをチェックアウト(つまり抽出)するため、ツールが実行hg checkout
(またはその内部同等物)によって機能する場合は、そもそも問題はありません。リビジョンのチェックアウトを回避するだけです。必要な最初のスナップショットの前に、それらをGitにインポートすると、結果のGit履歴が目的のポイントから始まります。
ただし、使用しているツールでこれが不便な場合は、すべてのブランチとマージを含むリポジトリ履歴全体をGitスナップショットに変換した後、Gitリポジトリを使用すると2回目のパスとして比較的簡単になります。Gitの履歴は、たとえば次のようになります。
o-..-o o--o <-- br1
/ \ /
...--o--o--....--o--*--o--o--o--o <-- br2
\ / \
o--...--o o <-- master
ここで、commit*
は、Gitリポジトリに表示したい最初のコミットです。(以前*
に遡る複数の履歴がある場合は、別の問題があり、追加の履歴変更なしではそもそもこの種の変換を実行できないことに注意してください。ただし*
、ある種のチョークポイントにある限り、この図では、ここでグラフを簡単に切り取ることができます。)
前にすべてを削除するには*
、単に使用git replace
の代替を作ることは非常に多くのですコミットするようなコミット*
が、親はありません。
git replace --graft <hash-of-*>
これで、Gitのほとんどが代わりに使用する、*
親コミットのない置換があります。次にgit filter-branch
、no-opフィルターを使用して、すべてのブランチとタグを実行します。
git filter-branch --tag-name-filter cat -- --all
これにより、代替を含むが除外するすべての到達可能なコミットとそれ自体の履歴が新しいコミットにコピーされ、ブランチ名とタグ名が更新されます。名前空間を削除し(詳細についてはドキュメントを参照)、必要に応じて元のオブジェクトの早期の清掃を強制します(余分なコミットは最終的には自動的に削除されます)。これで完了です。*
*
refs/originals/
git filter-branch
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加