2010-11-16 34 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 

其他方面的差异:同事,被运行git 1.6.5,我跑1.7.1

+0

你正在运行什么操作系统?您的存储库有多大? – 2010-11-16 07:35:41

+0

好点,我在帖子中添加了设置细节 – 2010-11-16 07:51:59

+0

只是第一次慢,还是后续分别调用'__git_ps1'和'git status'也慢?可能是一个缓存问题。 (在我的电脑上,第一个电话真的很慢,而且速度很快) – knittl 2010-11-16 08:13:18

回答

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),但它应该很容易实现,以及 – 2011-01-20 14:05:36

+0

谢谢,这很有用! – 2011-02-21 13:06:56

+0

+1:即使在使用相当小的存储库时,原来这也是我的命令提示符缓慢的原因。 – 2011-10-26 14:58:15

1

你可以尝试的git PS1我的版本是它更快或同样缓慢?

+0

它更慢。在这一点上,我一般都会用git来怀疑它,因为git的状态也会比你想要调用“git gc” – 2010-11-16 07:54:50

+0

的时间更长,这并没有什么区别。 – mpapis 2010-11-16 07:58:17

+0

的 – 2010-11-16 08:00:04

1

怎么样从 http://git.kernel.org/?p=git/git.git;a=tree;f=contrib/completion;h=525eddf7e4c03acc7b3f01f09f45515cf63cd9b4;hb=master

更新混帐completion.bash最新的是本地的这个内核回购或一般的问题?

请问git fsck --full什么?

+0

最新的git-completion.bash没有帮助。它也似乎是内核本地的,但我没有其他可比的大小来测试它。会离开git fsck - 当我离开时看到它是否已经出现了任何东西,尽管我认为回购没有问题,因为它是我同事盒子上工作回购的克隆。 – 2010-11-16 17:56:37

+0

和git fsck --full也没有发现任何问题。 – 2010-11-17 06:16:55

+2

从kernel.org克隆一个内核repo,并查看是否存在问题。如果那个确定的话,你的旧回购可能会以一种奇怪的方式被打破。另一种方法是对git状态使用“strace”来查看发生了什么。也许与你的学院机器上的strace输出差异。 – 2010-11-17 08:28:11

3

回购有子模块吗?见关于“git status现在很慢”(与子模块),这句话在this post,由于1.7.0进行了更改:

的修复/解决办法是通过“--ignore-submodules”到“git status”,如在下面的更新中提到:“更新:感谢VonC,他在下面的评论中指出,在git 1.7.2中现在有一个”-ignore-submodules“选项可以恢复旧的行为,也可以恢复提供了有用的选项,只更改文件(而不是未跟踪的文件)导致子模块显示为脏。“

+0

完整的内核树肯定有子模块。 – Cascabel 2010-11-16 16:48:31

+0

已升级到1.7.3并试用了--ignore-submodules,但它没有帮助。现在给1.6.6一个尝试。 – 2010-11-16 17:57:11

+0

1.6.6也没有帮助:( – 2010-11-16 18:09:54

7

知道哪儿这需要时间,你可以这样做:

的bash -x

然后

__git_ps1

矿正在采取时间

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

它列出了我的家庭drectory的所有文件。即使在一个快速的SSD上,它也花了相当长的时间。

+1

不错的提示,谢谢!结果同样的事情正在为我花费时间。 – 2011-02-22 10:58:04

4

为了解决这个问题只需在您的.bashrc

export GIT_PS1_SHOWDIRTYSTATE= 
export GIT_PS1_SHOWUNTRACKEDFILES= 

添加这将禁用某些文件查找窗口。

+0

是的,这就是我所做的。 – 2013-04-25 04:28:51