リポジトリが大きくなりすぎて使用できなくなりました。基本的に、私のリポジトリは 2GB を超えており、複製に時間がかかりすぎます。縮小したいのですが、特定の古いバージョンに戻すことはできます... 縮小には履歴の書き換えが含まれるので、それで問題ありません。クローンを持っている人は、新しいレポクローンの新しいブランチの上にファイルをリベース/チェリーピック/コピーする必要があります。
- このリポジトリにバイナリ ファイルがありますが、そこに必要です (ソフトウェアを実行するための必須のリソースと考えてください)。そのため、過去のコミットに戻すときに必要になる可能性があるため、フィルターブランチまたはBFGを使用して大きなバイナリ ファイルを削除することはできません。
- 以前の古い/既にマージされたブランチ (例: フィーチャー ブランチ) は気にしませんが、いくつかの特定のコミット (過去のリリース ブランチの例のヘッド) は気にします。
- (~多数~) 非常に古いコミットを変更するので、(基本的な rebase/cherrypick で発生する可能性があるように) マージの競合を適切に解決する方法がわかりません。そのため、競合が発生しない解決策を探しています。自動的に解決できる競合のみを生成します。
- 現在のすべてのブランチを保持したいので、クローンで作業を行っている人は、それらの変更をリベース/コピーできます。
- 古いレポの履歴と一致するように、新しいコミット間に関連する履歴が必要です (コミットが押しつぶされたかのように)。現在のブランチの履歴は、これらの古い押しつぶされたコミットの 1 つから始まります。
私はそれを不要な古いリポジトリ履歴のスカッシュと考えています。私の場合の可能なプロセスとしてこれまでに思いついたのは(いくつかの手順を見逃しており、これが私が思うことを行うかどうかまだ確信が持てません)は次のとおりです。
- 既存のリポジトリのミラーをクローンします。
- 保持したい古いコミットから孤立したブランチを作成します。これにより、必要なすべてのファイルを含む、親のない押しつぶされたコミットが作成されます。
- どういうわけかそれらをリンクして古いレポ履歴を再作成します=>どのように? マージ/リベース/リセット+コミットの孤児?
- 各現在のブランチのコミット リストを (間隔を使用して) チェリーピックし、それらを最初の発散コミットの親を押しつぶした最新のコミットに適用する => チェリー ピックされたコミット間隔を適用するコミットを自動的に見つける方法は? それは競合なしで機能しますか?
- タグを新しいツリーに移動します。前のツリーを削除します。gitガベージコレクト。
これは競合なしで実行可能/実行可能ですか? これはどのような場合でも機能しますか (git commit ツリーはかなり複雑になる可能性があります)? 安全かつ自動的に履歴をつぶすためのより良い解決策はありますか?
この種のメンテナンス タスクは、長期にわたるプロジェクトで発生するものであるように思われるため、他の大きなプロジェクトで何らかのソリューションが既に使用されていると思います。しかし、このユースケースの古いレポから新しいレポを作成するために、私が気付いていない git init (または別のコマンド) のオプションがあると思いますか?
更新:ここで解決策の始まりを見つけました: https : //wincent.com/wiki/Editing,_amending,_or_squashing_the_root_commit_in_a_Git_repository .