2010-11-16 2 views
25
$ time __git_ps1 
((v2.6.33.4)) 
real 0m1.467s 
user 0m0.864s 
sys 0m0.564s 

Это делает мое приглашение непригодным для использования; с другой стороны, однако, это слишком полезная функция, чтобы легко сдаться. Любая идея, почему она работает так медленно и что я могу с этим поделать?__git_ps1 чрезвычайно медленный в дереве ядра

Детали установки:

$ uname -a 
Linux martin-laptop 2.6.35-22-generiC#35-Ubuntu SMP Sat Oct 16 20:36:48 UTC 2010 i686 GNU/Linux 

$ git --version 
git version 1.7.1 

$ du -sh . 
876M . 

Я подозреваю, что что-то с моей машиной, так как на поле моего сослуживца, в самом дереве ядра я клонировали, и та же команда возвращается мгновенно

$ time __git_ps1 
((v2.6.33.4)) 
real 0m0.039s 
user 0m0.008s 
sys 0m0.016s 

добавления hdparm:

mine

$ sudo hdparm -tT /dev/sda4 

/dev/sda4: 
Timing cached reads: 1542 MB in 2.00 seconds = 772.35 MB/sec 
Timing buffered disk reads: 110 MB in 3.02 seconds = 36.42 MB/sec 

$ sudo hdparm -Tt /dev/sda6 

/dev/sda6: 
Timing cached reads: 1850 MB in 2.00 seconds = 926.03 MB/sec 
Timing buffered disk reads: 210 MB in 3.02 seconds = 69.53 MB/sec 

другие различия Коллега по: Коллега работает мерзавца 1.6.5, я бегу 1.7.1

+0

В какой операционной системе вы работаете? Насколько велик ваш репозиторий? –

+0

Хорошая точка, я добавил данные настройки к сообщению –

+0

, он медленный только в первый раз, или последующие вызовы '__git_ps1' соответственно' git status' тоже слишком медленные? может быть проблемой кэширования. (на моем ПК первый звонок очень медленный, после этого он быстро) – knittl

ответ

20

Оказалось, что сочетание двух вещей:

Я использовал

export GIT_PS1_SHOWDIRTYSTATE=true 
export GIT_PS1_SHOWUNTRACKEDFILES=true 

по умолчанию. который оказался непригодным для дерева по размеру ядра. Удаление этих параметров устраняет немного приятных функциональных возможностей от __git_ps1, но по крайней мере оно возвращается мгновенно. (Полезный урок - попробуйте материал из недавно созданной учетной записи пользователя прежде чем что-либо еще.)

Кроме того, жесткий диск на моем рабочем компьютере просто медленный, так что это не проблема git как таковая; это был первый случай, когда он действительно навязал мое уведомление.

+4

вы можете использовать 'git config --global bash.showDirtyState true' и переопределить это для дерева ядра только с помощью' git config bash.showDirtyState false'. для невоспроизведенных файлов (по git 1.7.3.2), но это должно быть легко реализовать, а также –

+0

спасибо, это полезно! –

+0

+1: Это оказалось причиной медлительности моей командной строки даже при работе с довольно небольшими репозиториями. –

1

могли бы вы попробовать мою версию git PS1 является его быстрее или одинаково медленно?

+0

еще медленнее. я подозреваю что-то с git в целом на данный момент, так как статус git тоже занимает больше времени, чем должно было –

+0

вы пытались назвать «git gc» – mpapis

+0

да, это не помогло. –

1

как об обновлении ГИТ-completion.bash последним из http://git.kernel.org/?p=git/git.git;a=tree;f=contrib/completion;h=525eddf7e4c03acc7b3f01f09f45515cf63cd9b4;hb=master

Является ли проблема локальной для этого ядра репо или вообще?

Есть ли git fsck --full что-нибудь?

+0

Последняя версия git-completion.bash не помогла. он также кажется локальным для ядра, но у меня нет ничего сопоставимого размера, чтобы его проверить. оставит git fsck --full running, когда я уйду, и посмотрю, что оно что-то появилось утром, хотя я думаю, что репо в порядке, так как это клон от рабочего репо в ящике моего коллеги. –

+0

и git fsck --full ничего не найдено. –

+2

клонировать ядро ​​repo с kernel.org и посмотреть, есть ли проблема там. Если это нормально, ваше старое репо, вероятно, сломается каким-то странным образом. Другой подход - использовать «strace» для статуса git, чтобы увидеть, что происходит. Возможно, это отличие от вывода strace на вашей машине в колледжах. –

3

Есть ли у репо подмодули? Смотрите замечание относительно «git status теперь очень медленно» (с подмодулями) в this post, из-за изменения введенной в 1.7.0:

Исправление/Обходной пройти «--ignore-submodules» в «git status», а в обновлении, приведенном ниже в разделе: «Обновление: благодаря VonC, который указывает в комментариях ниже, что в git 1.7.2 теперь есть опция« -ignore-subodules »для статуса git, который может восстановить старое поведение, а также предоставляет полезную опцию, в которой только измененные файлы (а не файлы без следа) приводят к тому, что подмодуль будет отображаться как «грязный».

+0

Полное дерево ядра, безусловно, имеет подмодули. – Cascabel

+0

повысился до 1.7.3 и опробовал --ignore-subodules, но это не помогло. давая 1.6.6 попробовать. –

+0

1.6.6 не помогло :( –

7

знать, где именно это занимает время, вы можете сделать:

Баш -x

затем

__git_ps1

Шахта принимает время для

++ git ls-files --others --exclude-standard 

Это были перечисление всех файлов моего встроенного дачного дворца. даже на быстрый ssd, потребовалось довольно много времени.

+1

хороший отзыв, спасибо! оказывается, то же самое занимает время для меня. –

4

Чтобы исправить это просто добавить это в .bashrc

export GIT_PS1_SHOWDIRTYSTATE= 
export GIT_PS1_SHOWUNTRACKEDFILES= 

Будет ли отключить некоторые файлы Двойник окна.

+0

yep, вот что я сделал. –

Смежные вопросы