1. ホーム
  2. ギット

[解決済み】git リポジトリから古い履歴を削除する方法は?

2022-04-18 19:53:31

質問

このシナリオに似たものは見つかりませんでした。

私は多くの履歴を持つgitリポジトリを持っています。500以上のブランチ、500以上のタグがあり、2007年半ばまで遡ることができます。このリポジトリには、~19,500 のコミットが含まれています。2010年1月1日以前の履歴をすべて削除して、より小さく扱いやすくしたいと考えています(履歴の完全なコピーはアーカイブリポジトリに保管しておきます)。

新しいリポジトリのルートにしたいコミットはわかっています。しかし、そのコミットから始まるようにレポを切り詰めるための正しいgit mojoがわかりません。私は、以下のようなものを推測しています。

git filter-branch

また、残しておきたい200以上のブランチをそれぞれ別々に処理し、パッチでレポを元に戻す必要があるかもしれません(何かというと する の方法を知っています)。

どなたかこのようなことをされたことがある方はいらっしゃいますか?もしそれが重要なら、私はgit 1.7.2.3を持っています。

解決方法は?

を作成することができます。 グラフト の親がない場合 (あるいは空のコミット、たとえばリポジトリの本当のルートコミット) に、新しいルートコミットの親を追加します。例 echo "<NEW-ROOT-SHA1>" > .git/info/grafts

グラフトを作成したら、すぐに反映されます。 git log で、不要な古いコミットがなくなっていることがわかります。

$ echo 4a46bc886318679d8b15e05aea40b83ff6c3bd47 > .git/info/grafts
$ git log --decorate | tail --lines=11
commit cb3da2d4d8c3378919844b29e815bfd5fdc0210c
Author: Your Name <[email protected]>
Date:   Fri May 24 14:04:10 2013 +0200

    Another message
 
commit 4a46bc886318679d8b15e05aea40b83ff6c3bd47 (grafted)
Author: Your Name <[email protected]>
Date:   Thu May 23 22:27:48 2013 +0200

    Some message

意図したとおりに表示されていれば git filter-branch -- --all で永続化します。

ご注意ください。 を実行した後 フィルタブランチ ステップでは、すべてのコミット ID が変更されているので、古いレポを使用している人は、新しいレポを使用している人と絶対にマージしてはいけません。