Як я можу очистити свою папку .git? Очистив каталог моїх проектів, але .git все ще є масовим


85

У .git / об'єкти в моїх рейках проектувати каталог ще масивний, після видалення сотні мегабайта випадково згенерованого сміття.

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

Що я можу зробити для очищення цього каталогу?

Відповіді:


137
  • Якщо ви додали файли, а потім видалили їх, краплі все ще існують, але звисають. git fsckперелічить недосяжні краплі та git pruneвидалить їх.

  • Якщо ви додали файли, скопіювали їх, а потім відкотили назад git reset --hard HEAD^, вони застрягли трохи глибше. git fsckне буде перераховувати будь-які звисаючі коміти або краплі, оскільки їх перезапис зберігається у вашій гілці . Ось один із способів гарантувати, що залишаться лише об’єкти, які є у вашій власній історії:

    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
    

Так, я зробив комісію, перш ніж помітити проблему. Я спробував все, окрім останньої команди. Коли я запускаю це з мого каталогу проекту "попередження: Ви, схоже, клонували порожнє сховище." Я читав документацію, але це важкі речі. Як я можу вказати клону на правильне джерело?
light24bulbs

1
@user file://fooURL-адреса відносно поточного каталогу, а file:///home/me/foo(три скісні риски) є абсолютною.
Джош Лі

Дякую! це зменшено вдвічі, але мій пакет все ще в десять разів більший за решту сховища. Я пробував обрізання ..
light24bulbs

1
@user Якщо у багатьох комітах помилково є великі файли, то, можливо, ви захочете скористатися git-filter-branch, щоб вибрати їх.
Джош Лі

2
Вибачте, без ефекту. Мій керівник розробників каже, що розмір зараз знаходиться в межах прийнятного, але несприятливого діапазону. Якщо у вас є час для того, щоб годувати мене ложкою, це було б чудово, але ви вже поставили мене на ноги. Дякую jleedev.
light24bulbs

33

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


3
git gc --aggressive --pruneпрацює для мене. git gcне. Можливо, налаштування за замовчуванням недостатньо.
Moonlight Knight

13

Sparkleshare створив 13 Гб файлів tmp_pack_ у моєму git після того, як не вдалося багато разів витягнути величезні зображення. Єдине, що допомогло, це ...

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

'git gc' не видалив ці файли.


Це досить грубе рішення, але я не бачу причин, щоб це не спрацювало. Приємно!
light24bulbs

1
Відчайдушні ситуації вимагають відчайдушних заходів, Це спрацювало як шарм! Tks.
medina

rm для команди linux? а як щодо користувача Windows тоді @cat?
гумуру

7

Якщо у вас все ще є великий репо після обрізки та перепакування ( 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 для керівництва


@DavidJames дякую за підказку. Я зробив це ще більш читабельним, ІМО
sehe

Про всяк випадок, коли хтось інший зіткнеться з цим: у аргументах у дужках є помилка: має бути --aggressive. Спробував відредагувати, але виявляється, ти не можеш відредагувати таку маленьку помилку
hellobenallan

@hellobenallan дякую за нотатку, виправлено
sehe

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.