Статус Git займає багато часу


85

Я використовую gitдля управління файлами в локальному каталозі на машині Windows - тут не задіяна мережа, я не натискаю і не тягну до / з іншої машини. У моєму каталозі є близько 100 файлів, усі тестові файли досить малі. Коли я бігаю git status, це регулярно займає 20-30 секунд. Це нормально? Чи можу я щось зробити, щоб пришвидшити його, або кращий спосіб дізнатись, в якому стані знаходиться моє сховище (змінені файли, невідстежені файли тощо)? gitЗдається, інші команди виконуються набагато швидше.


Яку версію git ви використовуєте? Будь ласка, попросіть про допомогу або в групі Google msysGit, або в списку розсилки git (git [на] vger.kernel.org, вам не потрібно підписуватися), можливо, це помилка git.
Якуб Нарембський

Відповіді:


128

Ви пробували git gc ? Це очищає корінь з git-репо.


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

4
Хехе, я просто побіг з git statusдопомогою timeкоманди і отримав «реальне» час 30.464s. Потім я побіг git gcпотім time git statusще раз і отримав реальний час 35.409s. Досить дивно.
RyanScottLewis

14
Це виправило мене з 33 секунд до менш ніж 1 секунди для більшості моїх сховищ. Було б непогано, якби Git сказав вам це зробити, коли ви почнете доходити до цього пункту. Я ніколи не знав, що це потрібно.
XP84,

При запуску git statusкілька разів поспіль наступні прогони займають лише частку першого. Отже, якщо ви працюєте git status, тоді, git gcі git statusзнову ж таки, очікується, що він буде працювати дуже швидко.
kiewic

7

По аналогічній проблемі я виявив, що наявність репозиторію git у каталозі нижче мого існуючого репозиторію git призвело до значного сповільнення.

Я перемістив вторинне репозиторій git кудись ще, і тепер швидкість швидка!


Я додаю подібну проблему. Що трапилось, це git init у підкаталозі. Проблема в тому, що subdir начебто прихований (вам потрібно зробити git статус всередині, щоб побачити зміни), але я думаю, git все ще намагається їх обчислити. Я ігнорую субдир, і зараз все добре.
mb14

6

Ви використовуєте якесь програмне забезпечення для захисту від вірусів? Можливо, це заважає речам. gitдля мене дуже швидко у вікнах із сховищами 1000 файлів.


1
Так, роботодавець доручив TrendMicro OfficeScan. Я вбив сканер вірусів, ті самі результати зі статусом git.
Matt McMinn

1
Іншим варіантом цієї теми є програмне забезпечення для шифрування на льоту, таке як Credant, яке може зробити вашу коробку набагато повільнішою.
Дон Бренсон

Це була проблема для мене. Вбив антивірус Касперського, і його статус повернувся до <1 секунди.
Робін Вінслоу

5

Ви пробували перефасовувати? git-prepack .

В іншому випадку спробуйте скопіювати каталог і видалити папку .git у продубльованому каталозі. Потім створіть новий каталог git і перевірте, чи все ще це повільно.

Якщо це все ще повільно, це звучить як проблема із системою чи обладнанням. Git закінчує статус сотень файлів для мене менш ніж за 5 секунд.


Здавалося, repack допомагає - після запуску я запустив стан, і він негайно повернувся. Однак я зачекав кілька секунд і знову запустив стан, і це зайняло 30 секунд. Я спробував продублювати каталог і отримав ту саму проблему.
Matt McMinn

Хм, цікаво. У вас є зовнішній диск? Або флеш-накопичувач USB? Спробуйте скопіювати репо там і перевірте, чи є якась різниця. Можливо, є проблема з диском, на якому він зараз працює.
thedz

На USB-накопичувачі немає різниці.
Matt McMinn

Це справді дивно. На сьогодні я можу сказати лише те, що я не знаю. Ви можете спробувати скопіювати свій репо та спробувати його на чужому комп’ютері - це, принаймні, повинно сказати вам, чи це проблема локальної для вашої системи.
thedz

4

Чомусь git statusособливо повільно після переміщення або копіювання папки сховища в нове місце.

Подальші прогони в цьому випадку зазвичай швидші.


1
Чи є спосіб уникнути цієї повільності з першого запуску? Я спробував git gc, але це не допомогло. Це не проблема, оскільки це відбувається лише в перший раз після копіювання файлів.
franksands

Я не знаю способу уникнути початкової повільності, але якби існувала якась команда, яка могла б це зробити, вона, мабуть, робила б те саме, що і початкова git statusкоманда, тому, ймовірно, знадобилося б стільки часу, щоб виконати.
DanJAB

4

Я git statusпрацював дуже повільно (до однієї хвилини), оскільки глобальний .gitignoreфайл знаходився в моєму користувацькому профілі Windows, який зберігався на недоступній спільній мережі.

git config --global core.excludesfile
показав щось на зразок \\Nxxxx0\User\Username\Eigene Dateien\gitignore_global.txt

З якоїсь причини \\Nxxxx0був недоступний, і мій userprofile був завантажений із резервної системи \\Nxxxxx1. Щоб це зрозуміти, знадобився деякий час, оскільки зазвичай мій профіль користувача прив’язаний до букви диска сценарієм запуску підприємства, і доступ до цієї букви диска працював як зазвичай. Я не впевнений, чому git-config використовував мережевий ресурс, а не букву диска (можливо, винен молодший я)

Після налаштування
git config --global core.excludesfile $HOME/Eigene\ Dateien/gitignore_global.txt
git statusповернувся до нормальної швидкості.



3

Для мене повільність була пов’язана з наявністю великої кількості відстежуваних файлів (тимчасових та вихідних файлів зі сценаріїв.) Запуск git status -uno, який виключає невідстежені файли, працював набагато швидше та відповідав моїм вимогам


1

Проблема для мене полягала в тому, що на моєму локальному жорсткому диску було клоновано багато різних сховищ, чим більше у вас репозиторіїв, тим довше буде потрібно для запуску таких команд, як git status.

Я просто видалив багато репозиторіїв, які мені більше не потрібні локально, і мій статус git перейшов з 1 хвилини ~ до 5 секунд.

Я не бачу тут жодної відповіді, подібної до цієї.


1
Я не думаю, що це може вплинути на стандарт git status будь-яким чином ви запускаєте в одному каталозі. Якщо ваші сховища зареєстровані в різних каталогах, ви можете одночасно запускати лише git statusодин із них. Це може бути інша історія, якщо ваші репозиторії git перекриваються, але це все одно погана ідея.
Губерт Гжесковяк,

@HubertGrzeskowiak це точно може. Вони були у мене в різних місцях на моєму жорсткому диску, але це сильно вплинуло на час завантаження при наборі стану git. Після видалення дублікатів сховищ він відразу став швидшим від кількох хвилин до 5 секунд.
Джек Перрі,

1

Ще одним аспектом, git statusякий буде вдосконалено (у Git 2.14.x / 2.15, Q4 2017), є також те, що він відображає ігноровані файли ( git status --ignored)

" git status --ignored", коли помічає, що каталог без будь-якого відстежуваного шляху ігнорується, все одно перераховує всі проігноровані шляхи в каталозі, що є непотрібним.
Шлях коду оптимізований, щоб уникнути цих накладних витрат.

Див. Коміт 5aaa7fd (18 вересня 2017 р.) Від Джеймсона Міллера ( jamill) .
(Об’єднано Junio ​​C Hamano - gitster- у комітеті 075bc9c , 29 вересня 2017 р.)

Поліпшення продуктивності git status --ignored

Покращити продуктивність логіки списку каталогів, коли вона хоче перерахувати не пусті ігноровані каталоги. Для того, щоб показати не пусті ігноровані каталоги, існуюча логіка буде рекурсивно перебирати весь вміст ігнорованого каталогу.
Ця зміна вводить оптимізацію, щоб зупинити перегляд вмісту, як тільки він знайде перший файл. Це може суттєво покращити продуктивність 'git status --ignored' у сховищах з великою кількістю файлів у ігнорованих каталогах.

Для прикладу різниці продуктивності на прикладі сховища з 196 000 файлами в 400 ігнорованих каталогах:

| Command                    |  Time (s) |
| -------------------------- | --------- |
| git status                 |   1.2     |
| git status --ignored (old) |   3.9     |
| git status --ignored (new) |   1.4     |

Детальніше про вдосконалення (встановлено в Git 2.17, Q2 2018) див цій відповіді .


Тут абсолютно випадковий приклад: node_modulesця зміна може вплинути на цю зміну. Просто можливо.
Сет Баттін,

1

У старих версіях git виникає проблема продуктивності зі статусом git - див. Шляхи покращення продуктивності стану git для отримання додаткової інформації.

git 2.13 має 1 виправлення та ще 2.17. я перейшов з 2,7 на 2,23, і це вирішило повільний статус. Найближчим часом планується чергове покращення.


0

У моєму випадку повільність була спричинена запуском git statusяк іншого користувача, ніж власник файлів у проекті.

Хоча це застосовується не у всіх випадках, простий chownдля вашого поточного користувача може зробити трюк.


-13

Спробуйте почати зі свіжого клону каси.

git clone myrepo mynewrepo

а потім зробіть git статус в mynewrepo.

Як варіант, і якщо ви сміливіші, приберіть сміття з існуючої каси.

git clean -dfx

Це дозволяє уникнути необхідності сканувати деякі (можливо великі) набори ігнорованих або не зареєстрованих файлів.


Я не думаю, що видалення всіх ваших проігнорованих файлів (що робить git clean) допомогло б, це вже їх ігнорує. Швидше за все, запуск git clean видалить всі ваші конфігураційні файли тощо, і т. Д. І цю команду не можна скасувати. Повторне клонування (спочатку збереження вашого старого сховища на випадок, якщо воно вам потрібно) набагато краще, ніж запуск git clean і має той самий ефект.
XP84,

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