Как я могу очистить мою папку .git? Очистил мой каталог проектов, но .git все еще массивный - PullRequest
70 голосов
/ 11 марта 2011

.git / objects в моем каталоге проекта rails по-прежнему массивны после удаления сотен мегабайт случайно сгенерированного мусора.

Я пробовал git add -A, а также другие команды для обновления индекса и удаления несуществующих файлов. Я понимаю, возможно, неправильно, что файлы с двумя именами символов в каталоге являются BLOB-объектами. Я попытался откатиться к предыдущим коммитам, но не повезло.

Что я могу сделать, чтобы очистить этот каталог?

Ответы [ 5 ]

114 голосов
/ 11 марта 2011
  • Если вы добавили файлы, а затем удалили их, капли все еще существуют, но висят.git fsck выведет список недоступных BLOB-объектов, а git prune удалит их.

  • Если вы добавили файлы, зафиксировали их, а затем откатились с помощью git reset --hard HEAD^, они застрялинемного глубже.git fsck не будет перечислять какие-либо оборванные коммиты или BLOB-объекты, потому что reflog вашей ветки удерживает их.Вот один способ убедиться, что останутся только объекты, которые есть в вашей истории:

    git reflog expire --expire=now --all
    git repack -ad  # Remove dangling objects from packfiles
    git prune       # Remove dangling loose objects
    
  • Другой способ также заключается в клонировании хранилища, поскольку оно будет нести только те объекты, которыедостижимы.Однако, если висящие объекты были упакованы (и если вы выполнили много операций, git вполне мог запаковать автоматически), то локальный клон будет нести весь пакетный файл:

    git clone foo bar                 # bad
    git clone --no-hardlinks foo bar  # also bad
    

    Вы должны указать протокол для принудительной установкиgit для вычисления нового пакета:

    git clone file://foo bar  # good
    
25 голосов
/ 11 марта 2011

Вы пробовали команду git gc?

11 голосов
/ 10 мая 2015

Sparkleshare создал 13 ГБ файлов tmp_pack_ в моем git после того, как не смог много раз вытащить огромную проверку изображений.Помогло только то, что ...

rm -f .git/objects/*/tmp_*

'git gc' не удалил эти файлы.

7 голосов
/ 14 марта 2011

Если у вас все еще остается большое репо после обрезки и переупаковки (gc --aggressive --prune=tomorrow ...), тогда вы можете просто искать лишний:

git rev-list --objects --all |
    while read sha1 fname
    do 
        echo -e "$(git cat-file -s $sha1)\t$\t$fname"
    done | sort -n

Это даст вам отсортированный списокобъектов в возрастающем размере.Вы можете использовать git-filter-branch, чтобы удалить преступника из вашего репозитория.

См. «Удаление объектов» в http://progit.org/book/ch9-7.html для руководства

1 голос
/ 02 декабря 2018

Рекурсивно:

find ./ -iname '*.!*' -size 0 -delete
for i in */.git; do ( echo $i; cd $i/..; git gc --aggressive --prune=now --force; ); done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...