【问题标题】:git pre-commit hook not running when running git commit -a运行 git commit -a 时 git pre-commit 挂钩未运行
【发布时间】:2017-08-18 06:14:49
【问题描述】:

我有一个本地预提交钩子,它执行,并在我运行时按预期停止提交 git commit

另外,正如预期的那样,我可以在运行git commit -n ...时绕过钩子

但是,运行 git commit -am "My message" 或者实际上只运行 git commit -a 似乎绕过了钩子并允许处理提交。

知道为什么会发生这种情况吗?

编辑:钩在下面。

PROJECT_ROOT=`git rev-parse --show-toplevel`
CHANGED=`git diff --stat -- $PROJECT_ROOT/myProj/myfile.ext | wc -l`
if [ $CHANGED -gt 0 ];
then
    echo "myfile.ext file has changed, are you sure you want to commit"
    echo "Use the -n parameter to process this commit."
    exit 1
fi

【问题讨论】:

  • 也粘贴钩子。
  • 正如你写的那样,我意识到我的钩子条件可能对每个命令的评估不同.. :)

标签: git githooks


【解决方案1】:

所以,这是用户错误..

钩子在两个实例中都在运行,但是当提供 -a 命令时,我用来检测文件更改的逻辑不起作用。

检查远程仓库就可以了。

CHANGED=`git diff origin/master --stat -- $PROJECT_ROOT/myProj/myfile.ext | wc -l`

编辑:感谢@torek,检查更改的更合适的方法是:

CHANGED=`git diff --cached --stat -- $PROJECT_ROOT/myProj/myfile.ext | wc -l`

【讨论】:

  • 这不是“检查远程仓库”,而是将与标记为 origin/masterlocal 提交关联的源代码树与您的 work- 中的源代码树进行比较树。它会给你不同的结果,但可能不是你想要的:工作树的内容不一定是要提交的内容;要提交的是索引中的任何内容。一般来说,应该将HEAD 提交与索引进行比较,对于人类来说,这是用git diff --cached 完成的(脚本编写者更喜欢“管道命令”,以免受到用户配置的影响)。
  • 啊,是的 - 我可能会因为从另一个 SO 问题中复制原始比较行而感到内疚 :) 感谢您的澄清!
  • 这绝对是一个进步。 :-) 我认为重要的是要注意,您实际上无法永远查看 remote 存储库中的任何内容,您只能查看自己的存储库。您可以(在任何时候)从远程git fetch 获取尽可能最新的 about 其他 repo,但这只是将他们的东西复制到 your回购。您所做的其他所有事情本质上都是本地的,并且在您工作时遥控器可能会发生变化。这是分布式存储库的基本属性,因此无需任何事情,但值得记住。
  • 另外注意,您可以通过使用git diff --quiet ...(隐含--exit-code)并检查结果来保存--stat ... | wc -l 所需的进程和管道。非零结果表示文件有更改。
猜你喜欢
  • 2013-01-06
  • 2014-06-27
  • 2011-11-16
  • 2019-06-18
  • 2019-11-26
  • 2017-05-15
  • 2015-08-19
  • 2020-06-24
  • 2014-02-15
相关资源
最近更新 更多