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