Git-特定のコミットの前に履歴内のすべてのコミットを押しつぶす

GreenSaguaro

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]

編集
0

コメントを追加

0

関連記事

分類Dev

すべてのgitコミットを1つに押しつぶす方法は?

分類Dev

Git:2つのコミット間のすべてのコミットを1つのコミットに押しつぶす方法

分類Dev

Git:2回前のコミットを履歴に追加します

分類Dev

gitは、作成者によるすべての分散コミットを1つのコミットに押しつぶします

分類Dev

gitは、作成者によるすべての分散コミットを1つのコミットに押しつぶします

分類Dev

これまでのすべてのgitコミットを単一のコミットに変換し、その履歴をすべて消去します

分類Dev

git rebasemasterを使用してコミットを押しつぶす最良の方法

分類Dev

Gitの履歴の途中でコミットを元に戻す

分類Dev

git履歴内のすべてのコミットのタイムゾーンを変更する

分類Dev

いくつかのブランチを持つgit履歴の特定のコミットを削除しますか?

分類Dev

Gitで最初の2つのコミットを押しつぶしますか?

分類Dev

Gitで最初の2つのコミットを押しつぶしますか?

分類Dev

Gitで最初の2つのコミットを押しつぶしますか?

分類Dev

押しつぶされたコミットを解凍するためにgit履歴を書き換える

分類Dev

Git:以前のすべての履歴なしでコミットをチェリーピックする方法

分類Dev

すべてのコミットをクリアし、git / githubの履歴を削除します

分類Dev

Gitを使用して最後のXコミットを一緒に押しつぶします

分類Dev

特定の以前のコミットに戻り、git履歴を変更しない

分類Dev

既存のgit履歴で単一のコミットを複数のコミットに分割する

分類Dev

7つのプッシュされたコミットをgitで1対1に押しつぶす方法は?

分類Dev

Git InteractiveRebase-コミットの順序と選択/押しつぶす順序

分類Dev

古いgit履歴を最初のコミットに結合する

分類Dev

履歴全体のすべてのコミットからのgitビュー/コピーファイル

分類Dev

インタラクティブなリベースなしで、歴史の真ん中で2つのGitコミットを押しつぶす

分類Dev

git format-patchを使用してコミットを1つのパッチにどのように押しつぶしますか?

分類Dev

git format-patchを使用してコミットを1つのパッチにどのように押しつぶしますか?

分類Dev

すべての履歴コミットを保持しながら、GitリポジトリをtfsGitに移行します

分類Dev

git rebase -iを使用してコミットを並べ替えても履歴が台無しにならないのはなぜですか?

分類Dev

gitマージ後、ブランチのコミット履歴をgitロググラフに保持します

Related 関連記事

  1. 1

    すべてのgitコミットを1つに押しつぶす方法は?

  2. 2

    Git:2つのコミット間のすべてのコミットを1つのコミットに押しつぶす方法

  3. 3

    Git:2回前のコミットを履歴に追加します

  4. 4

    gitは、作成者によるすべての分散コミットを1つのコミットに押しつぶします

  5. 5

    gitは、作成者によるすべての分散コミットを1つのコミットに押しつぶします

  6. 6

    これまでのすべてのgitコミットを単一のコミットに変換し、その履歴をすべて消去します

  7. 7

    git rebasemasterを使用してコミットを押しつぶす最良の方法

  8. 8

    Gitの履歴の途中でコミットを元に戻す

  9. 9

    git履歴内のすべてのコミットのタイムゾーンを変更する

  10. 10

    いくつかのブランチを持つgit履歴の特定のコミットを削除しますか?

  11. 11

    Gitで最初の2つのコミットを押しつぶしますか?

  12. 12

    Gitで最初の2つのコミットを押しつぶしますか?

  13. 13

    Gitで最初の2つのコミットを押しつぶしますか?

  14. 14

    押しつぶされたコミットを解凍するためにgit履歴を書き換える

  15. 15

    Git:以前のすべての履歴なしでコミットをチェリーピックする方法

  16. 16

    すべてのコミットをクリアし、git / githubの履歴を削除します

  17. 17

    Gitを使用して最後のXコミットを一緒に押しつぶします

  18. 18

    特定の以前のコミットに戻り、git履歴を変更しない

  19. 19

    既存のgit履歴で単一のコミットを複数のコミットに分割する

  20. 20

    7つのプッシュされたコミットをgitで1対1に押しつぶす方法は?

  21. 21

    Git InteractiveRebase-コミットの順序と選択/押しつぶす順序

  22. 22

    古いgit履歴を最初のコミットに結合する

  23. 23

    履歴全体のすべてのコミットからのgitビュー/コピーファイル

  24. 24

    インタラクティブなリベースなしで、歴史の真ん中で2つのGitコミットを押しつぶす

  25. 25

    git format-patchを使用してコミットを1つのパッチにどのように押しつぶしますか?

  26. 26

    git format-patchを使用してコミットを1つのパッチにどのように押しつぶしますか?

  27. 27

    すべての履歴コミットを保持しながら、GitリポジトリをtfsGitに移行します

  28. 28

    git rebase -iを使用してコミットを並べ替えても履歴が台無しにならないのはなぜですか?

  29. 29

    gitマージ後、ブランチのコミット履歴をgitロググラフに保持します

ホットタグ

アーカイブ