【发布时间】:2020-09-04 14:36:44
【问题描述】:
我正在使用我在 OSX (git version 2.24.3 (Apple Git-128)) 上的版本附带的 githooks pre-commit.sample。代码中有一些特殊之处,即与看似虚假的exec有关。
预提交示例包含以下代码(删除了不相关的行/块):
#!/bin/sh
against=HEAD
# Redirect output to stderr.
exec 1>&2
# If there are whitespace errors, print the offending file names and fail.
exec git diff-index --check --cached $against --
如果我尝试通过在最后一次 exec 调用之后附加验证来修改此代码,它永远不会运行。根据relevant AskUbuntu post,我了解exec 是什么让这一切发生。
但是,我不明白为什么exec 首先需要发生。如果有尾随空格,此行的钩子会失败,但如果我删除 exec 并直接调用 git diff-index ...,它的行为似乎相同。
换句话说,这个:
git diff-index --check --cached $against --
...表现得像这样:
exec git diff-index --check --cached $against --
...除了后者似乎更具限制性。我找不到有或没有 exec 的文件之间的区别,除了 exec 使得空格检查 必须 最后发生。
为什么示例创建者会选择exec 选项,而它的行为似乎与表面上限制较少的直接调用相同?
【问题讨论】:
-
好吧,正如您自己发现的那样,exec 调用永远不会返回。事实上,它用执行程序 (git) 替换了当前进程 (bash)。进程的退出代码将是 git 的退出代码。如果您不执行 exec,则 git 命令将作为单独的进程执行。如果在这种情况下,您只是添加一个“echo”进行测试,退出代码将是 echo 命令之一。
-
啊,脚本的返回值就是最后一条命令的返回值?因此,如果我在非
execed 命令之后进行验证,我需要确保检查git diff-index的非0 结果。谢谢!