2017-10-09 59 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

相关问题