2014-11-14 64 views
5

我目前爲bash(https://github.com/magicmonty/bash-git-prompt)維護一個git-prompt項目,我剛剛從一個與Docker合作的人那裏得到一個bug報告(https://github.com/magicmonty/bash-git-prompt/issues/97),他告訴我,每次他使用提示時,緩存都會失效,因爲.git目錄不斷被觸動。任何人都可以解釋,爲什麼「git狀態」觸及.git目錄?

我看過這個,發現它是命令git status,它涉及.git目錄。 看來,只有目錄條目本身和沒有內容被觸摸。 任何人都可以解釋,爲什麼這是必要的,或者這可能是一個在Git中的錯誤。

有沒有辦法顯示所有狀態信息,而無需觸摸.git目錄?

感謝您的幫助

更新:

由於整個理由使用git status命令是,確定未跟蹤文件的數量,我git ls-files --others --exclude-standard | wc -l取代它,它不需要鎖。

+4

快速瀏覽一下'strace git status'表明這個動作使用了一個鎖文件'.git/index.lock' – 2014-11-14 20:15:09

回答

6

strace git status顯示此操作使用鎖定文件.git/index.lock,這就是爲什麼.git的mtime更新。

git很酷,它使用環境變量GIT_INDEX_FILE來決定使用哪個鎖文件。如果未設置,git使用.git/index(這是默認設置),但如果設置,git將使用其值。從man git

GIT_INDEX_FILE

此環境允許的替代索引文件的規範。如果未指定,則使用默認值$GIT_DIR/index

所以:

GIT_INDEX_FILE=banana git status 

將不會更新您.git的修改時間。

所以你現在必須做出一個決定,你是否想沿着這條路走下去(當然有很多警告)。

祝你好運!

+0

這應該是有效的。謝謝。 – magicmonty 2014-11-14 20:32:22

+0

應該指出,在使用'git status'命令之前,索引文件必須被複制到給定的新文件中。否則git會在這裏找到一個空索引。 – magicmonty 2014-11-15 12:20:07

+0

@magicmonty一種可能性是建立一個鏈接(而不是複製)。 – 2014-11-15 12:29:12

相關問題