如何判断git是否使用" -a"预先提交钩子中的标志?

时间:2016-12-28 19:50:56

标签: git githooks git-commit pre-commit-hook

我有一个git pre-commit hook,它可以进行linting。当它被调用时,它会循环遍历分段文件并在它们上运行一个linter。这很有效。

但是,当您运行git commit -am 'Foo'时,它会在没有任何暂存文件的情况下运行。如何判断它是使用-a还是--all标志调用的?有没有更简单的方法来获取将存储在git中的文件?

1 个答案:

答案 0 :(得分:0)

将存储索引中的所有文件。您正在寻找“索引中与HEAD中的对应文件不同的文件”,您可以使用git diff找到这些文件,或者查找脚本git diff-index

请注意,分阶段版本可能与工作树版本不同,因此检查所有内容特别烦人且棘手。 (例如,对某些复杂的更改运行git add -p,然后选择 part 。)

这是一个虚拟预提交钩子的示例,它显示了与HEAD相关的每个文件的名称和状态,即索引与现有HEAD提交的不同之处。

#! /bin/sh

git diff-index --cached -r --name-status HEAD

echo pre-commit fail
exit 1

你的任务是从git diff-index --cached -r --name-status HEAD获取输出(可能添加了-z,也许没有),并弄清楚如何测试索引中的版本,而不是版本中的版本工作树

请注意,您可以使用git checkout-index将索引提取到工作树。当然,您要避免覆盖真正的工作树,即在其他地方建立临时工作树:

TMPTREE=$(mktemp -d)
...
git --work-tree=$TMPTREE checkout-index -- .
例如

。您可能还想建立一个临时索引,而不是常规索引,因为这可能会扰乱常规索引的缓存方面:

TMPINDEX=$(mktemp)
NORMINDEX=${GIT_INDEX_FILE:-$(git rev-parse --git-dir)/.index}
cp $NORMINDEX $TMPINDEX
GIT_INDEX_FILE=$TMPINDEX GIT_WORK_TREE=$TMPTREE checkout-index -- .

完成后务必清理临时文件和/或目录。

(没有测试这些代码片段。)