我有一个git pre-commit hook,它可以进行linting。当它被调用时,它会循环遍历分段文件并在它们上运行一个linter。这很有效。
但是,当您运行git commit -am 'Foo'
时,它会在没有任何暂存文件的情况下运行。如何判断它是使用-a
还是--all
标志调用的?有没有更简单的方法来获取将存储在git中的文件?
答案 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 -- .
完成后务必清理临时文件和/或目录。
(没有测试这些代码片段。)