3

どこかで、私が所有するプロジェクトの git リポジトリに巨大なファイルが追加されました。このプロジェクトを新しいマシンに複製しようとすると、プロジェクトが 37% で長時間「スタック」しているように見えます。このプロジェクトは、わずか数分で複製されます。

この長いクローン作成時間の原因となっているオブジェクトを特定するにはどうすればよいですか?

ファイルを「git rm」する方法を知っています。歴史にのみ存在する古いオブジェクトであっても、それは削除されますか?

ファイルを「git rm」すると、それがリポジトリから完全に削除されるのか、それとも単に先に進むのか、はっきりしません。

どんな助けでも大歓迎です!

4

3 に答える 3

5

Pro Gitには、これを行う方法の段階的な説明があります。少し手間がかかりますが、確実に行うことができます。以下の説明を信用することはできません -- その Web サイトから盗用しただけです (詳細な説明については、元の Web サイトを参照してください)。

  1. レポをパックします。

    $ git gc
    
  2. git データベースで最大のアイテムを見つけます。次のコマンドは、最大のものを 3 つリストし、最大のものは出力の最後の行になります (以下の例には、入力するコマンドとサンプル出力の両方が含まれています)。

    # In the following command, replace the pack*.idx filename
    # with whatever filename you find in the .git/objects/pack
    # directory:
    $ git verify-pack -v .git/objects/pack/pack-3f8c0...bb.idx | sort -k 3 -n | tail -3
    e3f094f522629ae358806b17daf78246c27c007b blob   1486 734 4667
    05408d195263d853f09dca71d55116663690c27c blob   12908 3478 1189
    7a9eb2fba2b1811321254ac360970fc169ba2330 blob   2056716 2056872 5401
    
  3. その最大のブロブに関連付けられているファイル名を尋ねます。

    $ git rev-list --objects --all | grep 7a9eb2fb
    7a9eb2fba2b1811321254ac360970fc169ba2330 git.tbz2
    
  4. そのファイルの履歴を取得します。

    $ git log --pretty=oneline -- git.tbz2
    da3f30d019005479c99eb4c3406225613985a1db oops - removed large tarball
    6df764092f3e7c8f5f94cbe08ee5cf42e92a0289 added git tarball
    
  5. git filter-branchそのファイルへのすべての参照を削除するには、次を使用します。

    $ git filter-branch --index-filter \
       'git rm --cached --ignore-unmatch git.tbz2' -- 6df7640^..
    Rewrite 6df764092f3e7c8f5f94cbe08ee5cf42e92a0289 (1/2)rm 'git.tbz2'
    Rewrite da3f30d019005479c99eb4c3406225613985a1db (2/2)
    Ref 'refs/heads/master' was rewritten
    
  6. このブロブへの残りのいくつかの参照をクリーンアップしてから、gc再度パックします。

    $ rm -Rf .git/refs/original
    $ rm -Rf .git/logs/
    $ git gc
    Counting objects: 19, done.
    Delta compression using 2 threads.
    Compressing objects: 100% (14/14), done.
    Writing objects: 100% (19/19), done.
    Total 19 (delta 3), reused 16 (delta 1)
    
于 2012-04-30T22:44:16.697 に答える
2

次のコマンドを使用して、コミット ツリーをトラバースできます。

git ls-tree <first-commit-hash> -r --long > 1.txt

次に、10Mb を超えるブロブの結果ファイルを grep します。

于 2012-04-30T22:39:09.487 に答える
1
find / -size +10M -ls

これにより、10MiB (正確には 10MB ではありません) を超えるファイルが検出されます。

ここに、少し役立つはずの素晴らしい説明があります。

https://askubuntu.com/a/36114

Github には、リポジトリのすべてのコミットされたバージョンから特定のファイルを削除することについての素晴らしい記事があります。

于 2012-04-30T22:12:09.287 に答える