Git 预提交hook don';t返回正确的输出

Git 预提交hook don';t返回正确的输出,git,bash,pre-commit-hook,Git,Bash,Pre Commit Hook,我试图使用git的预提交钩子来强制执行一些规则。我想使用git diff--name only检查任何未老化的已更改文件,如果存在,请使提交过程失败。但是,在我的预提交文件中: #!/bin/bash cd "$(git rev-parse --show-toplevel)" pwd test=$(git diff --name-only) echo "Untracked files: $test" exit 0 git diff--name only返回一个空字符串。如果在shell中运行该

我试图使用git的预提交钩子来强制执行一些规则。我想使用
git diff--name only
检查任何未老化的已更改文件,如果存在,请使提交过程失败。但是,在我的
预提交
文件中:

#!/bin/bash
cd "$(git rev-parse --show-toplevel)"
pwd
test=$(git diff --name-only)
echo "Untracked files: $test"
exit 0
git diff--name only
返回一个空字符串。如果在shell中运行该命令,则会看到未老化的文件发生更改。将命令更改为使用
sudo
似乎行为正确,这使我相信问题在于用户权限。但是
chmod u+x
ing甚至
chmod 777
ing
pre-commit
文件似乎不会影响结果


我还在git repo根目录中创建了一个类似的bash文件来测试该命令,它可以正常工作。

我认为应该使用
git diff--staged
来显示staged文件

并确保
git commit
触发了预提交脚本执行。当git提交时,只需检查第一行是repository direcotry


我已经测试了你的剧本,没什么问题。因此,我想您可能会注意到重命名
pre-commit.sample
pre-commit

我无法重现您的问题。不过,我要注意的是,
git diff--name only
将索引与工作树进行比较,因此它会找到修改过但未老化的文件(您的文本说这是您想要的)。到目前为止还不错,但你确实做到了:
echo“Untracked…”
这个词的意思是Untracked而不是unstage。@torek good catch,意思是unstage。