2009-12-31 59 views

回答

3

您需要確保兩個以下兩個屬性都滿足:

  1. 那裏面有頭和索引緩存

    git diff-index --cached HEAD

  2. 那有沒有區別索引與工作樹沒有區別:

    git diff-files

這兩個命令都需要--quiet參數,其將根據是否有差異或不設置的退出代碼(起始的git 1.4後的一段時間)。如果你需要在git 1.4上工作,你需要運行這些命令而不用--quiet並檢查它們是否產生任何輸出。

注:git diff是一個瓷器命令,因此不應該在腳本中使用。改用上面的管道命令。

實施例殼代碼,從我git_version.sh script採取:

git_dirty=yes 
# git-1.4 does not understand "git-diff-files --quiet" 
# git-1.4 does not understand "git-diff-index --cached --quiet HEAD" 
if [ "x$($GIT diff-files)" = "x" ] && [ "x$($GIT diff-index --cached HEAD)" = "x" ]; then 
    git_dirty=no 
fi 

如果能需要一個git版本> = 1.5,if git diff-files --quiet && git diff-index --quiet --cached HEAD; then可以代替上述的比較。

注:該解決方案(酷似安東尼的互動git diff HEAD --quiet)僅發現相對於頭部的局部變化。但是,本地提交也可以被認爲是本地更改,並且自然不會出現在與HEAD的任何差異中。您將需要檢查SHA1值git describe用於檢測HEAD是否來自您認爲不是本地更改的一組提交。

+0

另請參閱我的意見在http://stackoverflow.com/questions/1985301/how-to-make-git-describe-mention-the-presence-or-absence-of-local-changes/1985431#1985431 – 2010-01-01 18:54:49

0

git status如果沒有本地更改,則會退出非零狀態。

但我不明白你的意思是「結合使用git描述」。

+0

v1.1-5-g1234567將意味着沒有局部的變化和v1.1-5 - g1234567(+),將意味着與本地更改。 git狀態在此處返回1時出現未分配的本地更改 – 2009-12-31 13:38:13

1

git diff --quiet返回退出狀態1,如果有更改,則返回0,如果沒有更改。

請記住,它將顯示階段性更改和工作目錄之間的差異。 如果您對HEAD和工作目錄之間的更改感興趣,應該使用git diff HEAD --quiet

--quiet暗示--exit-code

+0

我看到此解決方案的兩個問題:a)'git diff'是瓷器,而git上游強烈建議不要在腳本中使用瓷器。 b)'git diff'將忽略已經在索引緩存中的任何未提交的更改。 請參閱我的答案在http://stackoverflow.com/questions/1985301/how-to-make-git-describe-mention-the-presence-or-absence-of-local-changes/1989142#1989142如何解決這些問題。 – ndim 2010-01-01 17:49:27

+0

問題是關於找到_local changes_。 'git diff HEAD --quiet'發現_local changes_正是您建議的兩個管道命令的結果。瓷器/管道的區別在這裏並不那麼重要。 – 2010-01-01 18:51:48

+0

git開發人員說要爲腳本使用管道命令,因此我將腳本作爲腳本的基礎。至於*本地修改*,'git diff HEAD --quiet'在功能上等價於我的兩個命令,但我仍然更喜歡API git upstream推薦用於腳本案例。 – ndim 2010-01-01 19:13:31

7

由於git 1.6.6,git-describe已接受--dirty選項。如果你有你的工作樹提交的修改,那麼你會得到的輸出是這樣的:

$ git describe --dirty 
1.0.2-2-g215081f-dirty 
相關問題