コーダーによるバイナリ ファイルのアナーキーな追加に直面し、問題のあるファイルを削除するだけでなく、ツリー内の履歴も削除して git リポジトリをスリム化する方法。
bfgを使用してみましたが、ミラー化されたベア リポジトリで動作するため、ワークフロー全体を取得するのが難しく、Web 上のさまざまな場所から回答を収集する必要がありました。
コーダーによるバイナリ ファイルのアナーキーな追加に直面し、問題のあるファイルを削除するだけでなく、ツリー内の履歴も削除して git リポジトリをスリム化する方法。
bfgを使用してみましたが、ミラー化されたベア リポジトリで動作するため、ワークフロー全体を取得するのが難しく、Web 上のさまざまな場所から回答を収集する必要がありました。
最終的にうまくいったのは、ミラーリングされたベアリポジトリと通常のリポジトリの間を行き来することです。長いように見えるかもしれませんが、大きな担当者から小さな担当者まで、すべてのステップが含まれており、実際には高速です (1,000 分のジョブ)。
最初に、すべての混乱を伴う最後のバージョンのローカル ミラー リポジトリを取得します (インターネット経由で時間がかかる場合があります。これは、潜在的に多くの時間がかかる可能性がある唯一のステップです)。
git clone --mirror http://myservice.org/myrepo
次に、バックアップ目的で結果をコピーします (冗談ではありません。最後に使用します)。
cp -r myrepo.git myrepo.git.bak
次に、クリーンアップできるように、ベア バージョンから通常のバージョンを作成します。
mkdir myrepo.small
cd myrepo.small
mkdir .git
cd .git
cp -r ../../myrepo.git/* .
cd ..
git config --local --bool core.bare false
そして、マスター ブランチでクリーンアップを行うと仮定します。
git checkout master
クリーンアップするには、次の方法で大きなレパートリーを見つけます。
du -sh *
そして、それらを削除します (バージョン管理されないようにしたい場合でも、後で元に戻します):
git rm bigThings
一部のファイルのみを保持し、それらを git 履歴から削除する場合は、使用できますgit rm --cached bigFile
が、すべてを削除し、履歴をクリーンアップしてから元に戻す方が簡単であることがわかりました。
必要に応じて、少なくともクリーンアップが完了したら、次のようにします。
git commit -m "big clean up"
結果をミラー化されたリポジトリにプッシュすることもできますが、新しいリポジトリを (リポジトリの親フォルダーから) 作成する方が簡単であることがわかりました。
rm -rf myrepo.git
git clone --mirror myrepo.small
最後に bfg をダウンロードし(Java がインストールされている必要があります)、ミラー化されたクローンで実行します。5M を超えるすべての履歴を削除したかったのですが、ダウンロードしたバージョンの bfg が にあった~/Downloads/bfg-1.12.5.jar
ので、以下を使用しました。
java -jar ~/Downloads/bfg-1.12.5.jar --strip-blobs-bigger-than 5M myrepo.git
クリーンアップを確認します(前後のサイズを確認して):
cd myrepo.small.git
du -sh
git reflog expire --expire=now --all && git gc --prune=now --aggressive
du -sh
軽く感じるはずです。この時点で私は見つけました:
git push ../myrepo
動作しないので、クリーンなミラーから再度作成しました:
rm -rf myrepo.small
mkdir myrepo
cd myrepo
mkdir .git
cd .git
cp -r ../../myrepo.small.git/* .
cd ..
git config --local --bool core.bare false
git checkout master
実際には、(bitbucket で) レポを削除し、空で再作成する方が簡単であることがわかりました。すべてが正しく設定されたら、.git/config と git push に適切な中央リポジトリを設定します
トラブルメーカーのアイテムをフォルダーに戻すために、最初にバックアップした通常のバージョンのリポジトリーでユニゾンを使用しました。
最初に通常バージョンのバックアップを作成します
mkdir myrepo.bak
cd myrepo.bak
mkdir .git
cd .git
cp ../../myrepo.git/* .
git config --local --bool core.bare false
git checkout master
cd ..
次に、2 つでユニゾンを実行します。
unison myrepo myrepo.bak
そして、私が必要としていたものを元に戻しました。すべての寄稿者に送信するために、filesenderまたはその他の USB スティックの代わりにその zipを送信すると、再び起動して実行されます。