2017-12-28 8 views
0

私の質問はこれと同じです。 Remove large .pack file created by git大きなパックファイルは解決しません

私はここに記載されているすべての手順に従っ:https://git-scm.com/book/en/v2/Git-Internals-Maintenance-and-Data-Recoveryもこのaccepted answerに記載されているすべての手順を試してみました。しかし、パックファイルのサイズは依然として大きい。前

count: 0 
size: 0 
in-pack: 2259 
packs: 1 
size-pack: 67333 
prune-packable: 0 
garbage: 0 
size-garbage: 0 

後:

count: 0 
size: 0 
in-pack: 2259 
packs: 1 
size-pack: 67333 
prune-packable: 0 
garbage: 0 
size-garbage: 0 

私はまだ、このコマンドを実行することができます:git verify-pack -v .git/objects/pack/pack-xxx.idx | sort -k 3 -n | tail -3をし、三個の大のファイルとそれに対応するコミットを参照してくださいが、私はgit log --oneline --branches -- <large_file_name>を実行すると、何のコミットはありませんこれはファイルを参照しています。これは、私がコミットの履歴を書き換えたためかもしれません。明らかに、私はラインに沿ってどこかにうんざりしているようです。

私の質問は、大きな.packファイルに関してこの問題を解決する方法です。 (それはあなたの意思だと仮定して)いいのよ、私はgit log --oneline --branches -- <large_file_name>を実行したとき、私はコミットの歴史を書き直したのでかもしれファイルを、リファレンスnoコミットがない

答えて

1

... ...

。ここで行う必要があるのは、他の外部参照がファイルを使用するコミットに到達していないことを確認することです。 --branchesを使用して

はすべて支店名参照、refs/heads/下すなわち、すべてのものを見てgit logまたはgit rev-list を伝えます。しかしタグ名の参照がrefs/tags/の下にある可能性がありますので、そこにチェックしてください。他の参考文献もあるかもしれないので、それらのすべてをチェックしてください。これを行う最も簡単な方法は、--branchesではなく--allを使用することです:すべての参照を参照してください。

しかし、これも個のreflogを見逃しています。すべてのリファレンスは(少なくとも潜在的に)reflogを持っています。 reflogsを歩くには、-gまたは--walk-reflogsを使用してください。これは個別に行う必要があることに注意してください。コミットを参照するreflogエントリがある場合、それを手動で期限切れにすることができます。または、reflogsがあなたのメインセーフティネットであるので少し危険ですが、はコピーの元リポジトリでです。 :-))。

git filter-branchを「履歴を書き換える」と使用すると、実際にはのすべての履歴が新しい履歴にコピーされます。そのため、フィルタで何をするかによって、リポジトリサイズを約2倍に一時的に増やすことができます。古いreflogを削除し、refs/original/名前空間の下に保存された元の参照を削除し、ガベージコレクションを行うと、サイズが縮小されます。

パックファイルに対応する.keepファイルがある場合、Gitは、すべてをカバーする新しいパックを作成した後でも、保管パックを廃棄しないことにも注意してください。すべての.keepファイルは手動で作成されたもので、適切な場合は手動で削除する必要があります。


この2つのコマンド、git loggit rev-listは、一つのソースファイル、builtin/log.cから構築され、実際にはかなり多くの1つのコマンドだけです。若干異なるエントリポイントがあり、いくつかの異なるデフォルトオプションが設定されています。git logは、git rev-listに開始点が必要ですが、他の開始点を指定しないとHEADから開始します。

+0

コマンドラインで指定したようにすべてのreflogエントリを追加するための '--reflog'オプションもあります。これは' --branches'がすべてのブランチヒントを追加するのと同じです。 – jthill

+1

@torekと@jthill - すべての情報に感謝します。私は最終的にリポジトリのサイズを縮小することができました。この[チェックリスト](https://git-scm.com/docs/git-filter-branch#_checklist_for_shrinking_a_repository)は、あなたのコメントに加えてそれを把握するのに役立ちました。具体的には、私はこれらのコマンドに従っていました: 'git for-each-ref --format ="%(refname) "refs/original/| xargs -n 1 git update-ref -d'、 'git reflog expire --expire = now --all'そして最後に' git gc --aggressive --prune = now' – Ram

+0

@jthill:このフラグはGit 1.5.0以降、Git 2.2.0までは文書化されていませんでした(と私は気づいていませんでした)。 – torek

関連する問題