2017-10-09 103 views
1

pre-receive的過程中,我得到fatal: This operation must be run in a work tree異常,同時點擊pre-receive掛鉤。我確定鉤子正在擊中,因爲我可以通過鉤子打印我自己的消息。致命:此操作必須在預接收鉤子上的工作樹上運行

#!/usr/bin/env bash 

FILES=`git diff --name-only --diff-filter=d HEAD~1` 
for COMMIT in $FILES; 
    do 
     case $COMMIT in 
     *.txt|*.pdf|*.docx) 
     echo "Hello there! We have restricted committing that filetype. 
     exit 1 
     ;; 
     esac 
done 
exit 0 

無論我的鉤子代碼是錯誤還是其他問題?但this hook正在運行。

+0

也許相關:https://stackoverflow.com/questions/25638767/git-diff- on-a-bare-repo –

回答

-1

git的差異有兩種形式:

  • 與一個相對樹工作之間提交diff來的<提交>
  • 具有兩個因爲在裸回購兩次提交

之間提交的diff沒有工作樹時,儘量使用

git diff --name-only --diff-filter=d HEAD~1 HEAD 
+0

確實要修復腳本,這需要檢查正確的頭部,但是錯誤的原因實際上是僅使用一次提交的git diff –

3

HEAD(如果它存在的話)不會指向您在裸倉庫中的預期值(當有人運行git clone時,它指向HEAD的初始值)。

從預收到鉤,你必須從STDIN閱讀提交哈希名單就知道在你們應該是什麼在:

git help githooks

前收到

...

這個鉤子執行一次用於接收操作。它不使用任何參數,但爲每個裁判要被更新它在標準 輸入端接收線路的格式:

<old-value> SP <new-value> SP <ref-name> LF 

其中<old-value>是存儲在REF舊的對象名,<new-value>是新的對象名存儲在參考文獻中, <ref-name>是參考文獻的全名。當創建一個新的裁判,<old-value>是40 0

所以,你的腳本可以這樣做:

#/usr/bin/env bash 

# read lines from stdin, assign first value to 'old', second to 'new', 
# third to 'refname' : 
while read old new refname; do 

    # use $old $new and $refname inside this block 
    FILES=`git diff --name-only --diff-filter=d $old $new` 

    ... 
done 
+0

還要注意,預接收鉤子將獲得各種各樣的所以你可能想檢查'refname'是否在'refs/heads'中,而不是說新的標籤被推送到'/ refs/tags' – Mort

相關問題