4

昔、私は誤って多数の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です。

なぜメインリポジトリで機能しないのかという問題が残っています。

4

1 に答える 1

5

それはすべてフォークのせいでした

誰かがGitHubであなたのリポジトリをフォークした場合、その中のエントリへのリンクと参照を保持していることがわかります。したがって、フォークを保持しているすべての人が自分のリポジトリでスクリプトを実行しない限り、パージは機能しません。

于 2012-10-16T19:37:12.047 に答える