Чи є спосіб зменшити розмір папки git?


156

Здається, мій проект з кожним виступом стає все більшим і більшим commit/push. Чи є спосіб очистити мою папку git?

Відповіді:


214

Я не впевнений, чого ти хочеш. Перш за все, звичайно, щоразу, коли ви вводите / натискаєте каталог, він стає трохи більшим, оскільки він повинен зберігати кожен із цих додаткових комісій.

Однак, ймовірно, ви хочете, git gcщо "очистить непотрібні файли та оптимізує локальний сховище" ( сторінка з посібником ).

Інша, можливо, відповідна команда - git cleanце видалення файлів, що не відслідковуються, з вашого дерева ( сторінка вручну ).


30
git clean -d -f -x видаляє файли, перелічені у .gitignore тощо. Наприклад, робочі місця, які не належать до git, папки Pods тощо
Kalle

102
WARNINGКоманда , як написано вище, @Kalle видалить КОЖЕН > неотслежіваемих <файл і каталог в межах вашої GIT ROOT , НЕ просто «файли , перераховані в .gitignore». .gitignoreБуде видалено все, що не відстежується Git, незалежно від того, вказано воно чи ні . git clean -dfX(зверніть увагу на випадок у справі X), буде видалено лише ті елементи, у яких є відповідне правило .gitignore. Будь ласка, прислухайтесь до цього попередження: Ніколи не запускайте, git cleanне запускаючи його в інтерактивному режимі, -iзамість цього -fабо принаймні виконайте сухий запуск спочатку - -nа потім знову з -f.
Адріан Гюнтер

5
Або зробити резервну копію :-)
Mateen Ulhaq

61

Виконати:

git remote prune origin

Видаляє всі відстояні гілки відстеження, які вже видалено, originале все ще доступні локально remotes/origin.

git gc --auto

' G arbage C ollection' - виконує завдання з ведення господарства (стискає доопрацювання, видаляє сипучі / недоступні об'єкти). Спочатку --autoпрапор визначає, чи потрібна якась робота, і виходить, не виконуючи нічого, якщо ні.


4
Деякі пояснення того, що вони роблять? Я знаю, що ми можемо їх переглядати Google і шукати їх документацію, але це звичайна практика надати короткий опис вашої відповіді, коли вона містить лише код або команди.
Джунейт

28

Один із сценаріїв, коли ваше git repo буде ставати серйозно більшим із кожним фіксуванням, це той, коли ви створюєте двійкові файли, які ви регулярно створюєте. Їх зберігання не буде настільки ефективним, як текстовий файл .

Інший - це той, де у вас є величезна кількість файлів у межах одного репо (що є лімітом git ) замість кількох підрепортажів ( керованих як підмодулі ).

У цій статті про git space AlBlue згадує:

Зауважте, що Git (і Hg, і інші DVCS) страждають від проблеми, коли (великі) двійкові файли перевіряються, потім видаляються, оскільки вони все одно з’являться у сховищі та займають місце, навіть якщо вони не є поточними .

Якщо у вашому git repo зберігаються великі бінарні файли, ви можете врахувати:

  • управління цими бінарними файлами у зовнішньому сховищі .
  • керуйте розміром .git repo
  • спробувати видалити ці виконавчі файли з вашої історії зgit filter-branch (попередженням: це буде переписати історію, що погано , якщо ви вже штовхнули свій репозиторій , і якщо інші витягали з нього)

Як я вже говорив в « Які межі файлів в Git (кількість і розмір)? », Тим більше в останній час (2015-го, через 5 років після цієї відповіді) Git LFS з GitHub є спосіб управління цими великими файлами (зберігаючи їх поза Сховище Git).


1
Підтримка великих файлів git корисна, якщо у вас регулярно додаються / оновлюються великі двійкові файли (наприклад, зображення). Дивіться git-lfs.github.com . Супер простий у виконанні, підтримується github. Усі члени команди повинні встановити його, щоб спільно використовувати його.
Ерік Вудс

@EricWoods True. Раніше я згадував Git-LFS (64 рази: stackoverflow.com/search?tab=newest&q=user%3a6309%20git-lfs ). Я відповідно відредагував цю стару відповідь.
VonC

Га, справді! Смішно, як відповідь у віці 9+ років залишається актуальною (а тепер тим більше з інформацією про LFS).
Ерік Вудс

22

так Так, git gc це рішення, природно,

та локально - ви можете просто видалити локальне сховище та знову його клонувати,

але тут є щось важливіше ...

секунди, які ви чекаєте, коли величезні git & externals для обробки збираються на довгі хвилини, за які збираються години неефективного часу,

Створіть нове (цілком, а не лише гілка) сховище з нуля , включаючи єдину останню версію файлів, природно ви втратите всю історію,

але коли в кодовому світі не настав час сентиментальності, немає сенсу перетягувати коди протягом усіх 5 років на кожну фіксацію чи різницю, ви все одно можете зберігати старі git & externals де-небудь, якщо ви відчуваєте ностальгію:]

але в якийсь момент вам дійсно доведеться рухатись далі:]

ваша команда буде вам вдячна!


12
Повністю згоден, нещодавно ми застосували такий підхід зі старим сховищем і не оглянулися назад; ну, головним чином тому, що ми не можемо, але ви знаєте, що я маю на увазі :)
WhatIsHeDoing

13

Запуск цієї команди надзвичайно небезпечно, але зменшить ваш сховище, видаливши всі файли відновлення / резервного копіювання git:

git reflog expire --expire=now --all && git gc --prune=now --aggressive

Це видалить усі файли, якими користується git, щоб відновити ваш сховище з якоїсь поганої команди, наприклад, якщо ви це зробили git reset --hard, зазвичай ви можете відновити втрачені файли. Але якщо ти зробиш git reset --hardперед git reflog expire...командою, то втратив усе. Тепер ваша єдина надія - скористатись інструментом, який аналізує вашу файлову систему та намагається відновити видалені файли, якщо вони не були відмінені.


3
Я справді не назвав би це надзвичайно небезпечним . Я б просто позначив це тим, з чим треба бути обережним . На мій досвід, мало хто насправді торкається відмивання або недосяжних об’єктів - більшість навіть не знає, що вони там, або як взаємодіяти з ними, і тому застрягають у ситуаціях, коли вони були б корисні, або роблять речі жахливо неефективний спосіб. Я б пішов так далеко, щоб сказати, що якщо ви не знаєте і не можете зрозуміти, що будуть робити ці команди, то можете сміливо виконувати їх!
Кріс Морган

10

git clean -d -f -i це найкращий спосіб зробити це.

Це допоможе очистити більш контрольований спосіб.

-i розшифровується як інтерактивний.


3
Хоча питання ОП нечітке, і це хороша відповідь у цьому відношенні, я хочу зазначити, що git cleanце не для очищення репо, а не для очищення каталогу. Для користувачів, які сліпо копіюють / вставляють, будьте обережні; це вилучає непотрібні файли / бруски, які ви насправді можете захотіти локально.
sraboy

git clean -d -x -f прекрасно працює, якщо ви хочете глибоко очистити
Rishabh Jain

2

Не знаю, чи скоротить це, але після запуску git cleanя також часто роблю git repack -adце, що зменшує кількість файлів упаковки.


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