昔、私は誤って多数のJavaアーティファクト(.war、.jar、.class)をGitHubリポジトリにコミットしていました。これにより、サイズが約100Mbにまで大きく膨らみました。後で多くのコミットとブランチがマージされるまで気づきませんでした。
幸いなことに、これについては多くの情報があります。そのため、StackOverflow、GitHub、Gitのドキュメントを際限なくトロールした後(みんなに感謝します)、ついに次のスクリプトをまとめることができました。
#!/bin/bash
echo "Removing history for *.war, *.jar, *.class files"
echo "Starting size"
git count-objects -v
echo "Removing history for *.war, *.jar, *.class files"
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch *.war' --prune-empty --tag-name-filter cat -- --all
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch *.jar' --prune-empty --tag-name-filter cat -- --all
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch *.class' --prune-empty --tag-name-filter cat -- --all
echo "Purging refs and garbage collection"
# Purge the backups
rm -Rf .git/refs/original
# Force reflog to expire now (not in the default 30 days)
git reflog expire --expire=now --all
# Prune
git gc --prune=now
# Aggressive garbage collection
git gc --aggressive --prune=now
echo
echo "Ending size (size-pack shows new size in Kb)"
git count-objects -v
# Can't do this in the script - it needs a human to be sure
echo
echo "Now use this command to force the changes into your remote repo (origin)"
echo
echo git push --all origin --force
これはローカルで完全に機能し、100Mbのリポジトリは約2Mbに低下しました。次に、
git push --all origin --force
GitHubリポジトリ内のすべてのブランチをローカルの変更で上書きするコマンド。すべてうまくいった。すべてを確認するために、ローカルリポジトリを削除し、GitHubからクローンを作成しました。これは2Mbであるはずでしたが、やはり100Mbでした。
それで、すべてのそのとりとめのない後、私はどこで間違ったのですか?パージされた履歴でローカルリポジトリを使用するようにGitHubに強制するにはどうすればよいですか?
詳細については編集
GitHubリポジトリには、それを取り巻く多くの追加情報(問題、wiki、時計など)があるため、削除できません。空のスクラッチリポジトリに対してこのスクリプトを実行すると、正常に機能します。複製されたリポジトリは2Mbです。
なぜメインリポジトリで機能しないのかという問題が残っています。