Подтвердить что ты не робот

Как я могу очистить папку .git? Убрал мой каталог проектов, но .git все еще массивный

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

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

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

4b9b3361

Ответ 1

  • Если вы добавили файлы, а затем удалили их, капли все еще существуют, но свисают. git fsck отобразит недостижимые капли, а git prune удалит их.

  • Если вы добавили файлы, зафиксировали их, а затем отбросили с помощью git reset --hard HEAD^, theyre застрял немного глубже. git fsck не будет перечислять какие-либо оборванные коммиты или капли, потому что ваши ветки 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
    

Ответ 2

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

Ответ 3

Sparkleshare создал 13GB файлов tmp_pack_ в моем git после того, как вы не смогли многократно выгружать огромные изображения. Единственное, что помогло, было...

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

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

Ответ 4

Если у вас все еще есть большое репо после обрезки и переупаковки (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 для руководства

Ответ 5

Рекурсивный:

find ./ -iname '*.!*' -size 0 -delete
for i in */.git; do ( echo $i; cd $i/..; git gc --aggressive --prune=now --force; ); done

Ответ 6

Вот команда, которую я использовал для фактического удаления файлов (я использовал ответьте, чтобы найти виновных):

git filter-branch --tree-filter 'rm -rf path/to/folder' HEAD

Если вам нужно удалить только один файл, вы можете сделать:

git filter-branch --tree-filter 'rm filename' HEAD

Источник: Постоянно удалять файлы и папки из репозитория git