У меня есть репо размером 10 ГБ на машине Linux с NFS. Первый раз git status
занимает 36 минут, последующий - git status
8 минут. Кажется, что Git зависит от ОС для кеширования файлов. Только первые git
команды вроде commit
, status
которые включают упаковку / переупаковку всего репо, занимает очень много времени для огромного репо. Я не уверен, что вы использовали git status
такое большое репо, но кто-нибудь сталкивался с этой проблемой?
Я попытался git gc
, git clean
, git repack
но время , потраченное по - прежнему / почти то же самое.
Помогут ли подмодули или любые другие концепции, такие как разбиение репо на более мелкие? Если да, то какой вариант лучше всего подходит для разделения более крупного репо. Есть ли другой способ сократить время, затрачиваемое на команды git в большом репо?
источник
Ответы:
Чтобы быть более точным, git зависит от эффективности
lstat(2)
системного вызова, поэтому настройка клиентского «тайм-аута кеширования атрибутов» может помочь.Руководство для
git-update-index
- по сути, ручного режимаgit-status
- описывает, что вы можете сделать, чтобы облегчить это, используя--assume-unchanged
флаг для подавления его нормального поведения и вручную обновляя пути, которые вы изменили. Вы можете даже запрограммировать свой редактор так, чтобы этот флаг снимался каждый раз при сохранении файла.Альтернативой, как вы предлагаете, является уменьшение размера вашей кассы (размер файлов пакетов здесь не играет роли). Возможные варианты: разреженная проверка, подмодули или инструмент репо от Google .
(В списке рассылки есть ветка об использовании Git с NFS , но она не отвечает на многие вопросы.)
источник
core.preloadindex
значение true - см.git-config
Документацию для получения небольшого описания. (На моем рабочем месте используется NFS, и я столкнулся именно с этой проблемой, но никогда не замечал настройки preloadindex. Спасибо, что указали мне правильный путь!)core.preloadindex
flag установлен в true по умолчанию, начиная сЯ также вижу эту проблему в большом проекте, совместно используемом через NFS.
Мне потребовалось некоторое время, чтобы обнаружить флаг -uno, который можно присвоить как git commit, так и git status.
Этот флаг запрещает поиск неотслеживаемых файлов. Это значительно сокращает количество операций nfs. Причина в том, что для того, чтобы git обнаружил неотслеживаемые файлы, он должен искать во всех подкаталогах, поэтому, если у вас много подкаталогов, это повредит вам. Отключив git от поиска неотслеживаемых файлов, вы устраните все эти операции NFS.
Совместите это с флагом core.preloadindex, и вы сможете получить приемлемую производительность даже на NFS.
источник
status.showUntrackedFiles
config.Попробуйте git gc . Также может помочь git clean .
ОБНОВЛЕНИЕ - Не уверен, откуда пришло голосование против, но в руководстве по git конкретно указано:
Я всегда замечаю разницу после запуска git gc, когда git status медленный!
ОБНОВЛЕНИЕ II - Не уверен, как я это пропустил, но OP уже пробовал
git gc
иgit clean
. Клянусь, изначально этого не было, но я не вижу изменений в правках. Простите за это!источник
git gc
сократить времяgit log
запуска с 15 секунд до 0 на одном из моих репозиториев.Если ваше репозиторий git интенсивно использует подмодули, вы можете значительно ускорить работу git status, отредактировав файл конфигурации в каталоге .git и настроив
ignore = dirty
любые особенно большие / тяжелые подмодули. Например:Вы потеряете удобство напоминания о том, что есть неустановленные изменения в любом из подмодулей, о которых вы, возможно, забыли, но вы все равно сохраните основное удобство, зная, когда подмодули не синхронизированы с основным репо. Кроме того, вы по-прежнему можете изменить свой рабочий каталог на сам подмодуль и использовать в нем git status, как обычно, для просмотра дополнительной информации. См. Этот вопрос для получения более подробной информации о том, что означает «грязный».
источник
Производительность git status должна улучшиться с выходом Git 2.13 (второй квартал 2017 г.).
См. Commit 950a234 (14 апреля 2017 г.) Джеффа Хостетлера (
jeffhostetler
) .(Объединено Junio C Hamano -
gitster
- в коммите 8b6bba6 , 24 апреля 2017 г.)>
string-list
: использоватьALLOC_GROW
макрос при перегруппировкеstring_list
Кроме того, Git 2.17 (второй квартал 2018 г.) представит новую трассировку для измерения времени, затрачиваемого на операции с интенсивным индексированием.
См. Commit ca54d9b (27 января 2018 г.) Нгуен Тай Нгук Дуй (
pclouds
) .(Объединено Junio C Hamano -
gitster
- в фиксации 090dbea , 15 февраля 2018 г.)Тот же Git 2.17 (второй квартал 2018 г.) улучшается за счет
git status
:commit f39a757 , commit 3ca1897 , commit fd9b544 , commit d7d1b49 (09 января 2018) Джефф Хостетлер (
jeffhostetler
) .(Объединено Junio C Hamano -
gitster
- в фиксации 4094e47 , 8 марта 2018 г.)«
git status
» может тратить много циклов на вычисление связи между текущей веткой и ее восходящим потоком, что теперь можно отключить с помощью параметра «--no-ahead-behind
».совершить ebbed3b (25 февраля 2018 г.), автор: Деррик Столи (
derrickstolee
) .Git 2.24 (3 квартал 2019 г.) предлагает еще одну настройку для повышения
git status
производительности:См. Коммит aaf633c , фиксацию c6cc4c5 , фиксацию ad0fb65 , фиксацию 31b1de6 , фиксацию b068d9a , фиксацию 7211b9e (13 августа 2019 г.) от Деррика Столи (
derrickstolee
) .(Слияние Junio C Hamano -
gitster
- in коммите f4f8dfe , 09 сентября 2019 г.)Но:
В Git 2.24 (4 квартал 2019 г.) кодовый путь, читающий
index.version
конфигурацию, был нарушен в последнем обновлении, которое было исправлено.См. Коммит c11e996 (23 октября 2019 г.) Деррик Столи (
derrickstolee
) .(Объединено Junio C Hamano -
gitster
- в коммите 4d6fb2b , 24 октября 2019 г.)источник
index.threads
настройку конфигурацииgit config --global core.preloadIndex true
Сделал для меня работу. Ознакомьтесь с официальной документацией здесь .
источник
2.7.4
. Я использую подсистему Linux для Windows, и даже при обновлении,apt-get
похоже, есть ссылки на довольно старые пакеты.В нашей кодовой базе, где у нас есть где-то в диапазоне от 20 до 30 подмодулей,
git status --ignore-submodules
я значительно ускорился. Обратите внимание, что это не будет сообщать о состоянии подмодулей .
источник
Что-то, о чем еще не упоминалось, - это активировать кеш файловой системы на машинах с Windows (файловые системы Linux совершенно разные, и git был оптимизирован для них, поэтому это, вероятно, помогает только в Windows).
В крайнем случае, если git все еще работает медленно, можно отключить проверку времени модификации, чтобы git узнал, какие файлы были изменены.
НО: измененные файлы должны быть впоследствии добавлены самим разработчиком с расширением
git add
. Git сам не находит изменений.источник
источник
Оставшиеся
index.lock
файлыgit status
может быть патологически медленным, когда у вас есть остаткиindex.lock
файлы.Особенно это случается, когда у вас
git submodules
, потому что тогда вы часто не замечаете такие оставшиеся файлы.Резюме: запустите
find .git/ -name index.lock
и удалите оставшиеся файлы, убедившись, что они действительно не используются какой-либо запущенной программой.Детали
Я обнаружил, что мой статус оболочки git был очень медленным в моем репо, с git 2.19 на Ubuntu 16.04.
Покопался и обнаружил, что
/usr/bin/time git status
у меняassets
подмодуле git требуется 1,7 секунды.Нашел с
strace
этим git, прочитал там все мои большие файлы сmmap
. Обычно этого не происходит, обычноstat
достаточно.Я погуглил проблему и обнаружил проблему с использованием индекса и Racy Git .
Пробовал
git update-index somefile
(в моем случаеgitignore
в проверке подмодуля), показанный здесь, но не удалосьЭто классическая ошибка. Обычно вы замечаете это при любой операции git, но для подмодулей, которые вы не часто выполняете, вы можете не замечать этого месяцами, потому что он появляется только при добавлении чего-либо в индекс; предупреждение не появляется только для чтения
git status
.Удаление
index.lock
файла,git status
быстро стало сразу,mmaps
исчезло, и теперь он стал более чем в 1000 раз быстрее.Так что, если ваш статус git неестественно медленный, проверьте
find .git/ -name index.lock
и удалите остатки.источник
Это довольно старый вопрос. Хотя я удивлен, что никто не прокомментировал двоичный файл, учитывая размер репозитория.
Вы упомянули, что ваш репозиторий git составляет ~ 10 ГБ. Похоже, что помимо проблемы NFS и других проблем с git (решаемых с
git gc
помощью изменения конфигурации git, как указано в других ответах), команды git (git status, git diff, git add) могут быть медленными из-за большого количества двоичных файлов в репозитории . git не подходит для обработки двоичного файла. Вы можете удалить ненужный двоичный файл, используя следующую команду (пример приведен для файла NetCDF; предварительно сделайте резервную копию репозитория git):git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch *.nc' \ --prune-empty --tag-name-filter cat -- --all
Не забудьте поместить '* .nc' в файл gitignore, чтобы git не повторно принял файл.
источник