__git_ps1 чрезвычайно медленный в дереве ядра

$ time __git_ps1
((v2.6.33.4))
real    0m1.467s
user    0m0.864s
sys  0m0.564s

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

Сведения об установке:

$ 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:

шахта

$ 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

другие отличия: работает сотрудник git 1.6.5, я запускаю 1.7.1

Ответ 1

Это оказалось комбинацией двух вещей:

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

export GIT_PS1_SHOWDIRTYSTATE=true
export GIT_PS1_SHOWUNTRACKEDFILES=true

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

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

Ответ 2

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

bash -x

затем

__ git_ps1

Мина брала время на

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

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

Ответ 3

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

export GIT_PS1_SHOWDIRTYSTATE=
export GIT_PS1_SHOWUNTRACKEDFILES=

Отключит просмотр файлов.

Ответ 4

Есть ли у репо подмодули? См. Замечание "git status сейчас очень медленно" (с подмодулями) в этот пост из-за изменения, внесенного в 1.7.0:

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

Ответ 5

Можете ли вы попробовать мою версию git PS1, это быстрее или равномерно?