在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 :(得分: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有两种形式:
因为在裸仓库上没有工作树,所以尝试使用
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