致命的:此操作必须在预接收挂钩的工作树中运行

时间:2017-10-09 11:35:27

标签: git bash githooks git-diff

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完全正常运行。

2 个答案:

答案 0 :(得分:3)

HEAD(如果它存在的话)将不会指向您在裸存储库中的预期(当有人运行HEAD时,它指向git clone的初始值)。

从预接收挂钩中,您必须从STDIN读取提交哈希列表,以了解您应该查看的提交内容:

  来自git help githooks

     

<强>预接收

     

...

     

此挂钩执行一次以进行接收操作。它不需要参数,但是对于每个ref都要更新它在标准上接收    输入以下格式的行:

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

其中<old-value>是存储在ref中的旧对象名,<new-value>是要存储在ref中的新对象名称,    <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

答案 1 :(得分:-1)

git diff有两种形式:

  • 在工作树之间相对于&lt; commit&gt;
  • 的一个提交差异
  • 两个提交之间有两个提交差异

因为在裸仓库上没有工作树,所以尝试使用

library(purrr)
library(dplyr)
myfun <- function(n) {
        require(purrr)
        require(dplyr)
        S <- "Range"
        df <- Reduce("data.frame", lapply(1:(n-2), function(x) data.frame(c(paste0(S, 1), rep(paste0(S, 2), x), rep(paste0(S, 3), n-x-1))))) %>%
                setNames(paste0("Perm", 1:(n-2)))
        return(df)
    }

df <- myfun(6)
   # Perm1  Perm2  Perm3  Perm4
# 1 Range1 Range1 Range1 Range1
# 2 Range2 Range2 Range2 Range2
# 3 Range3 Range2 Range2 Range2
# 4 Range3 Range3 Range2 Range2
# 5 Range3 Range3 Range3 Range2
# 6 Range3 Range3 Range3 Range3