使用 git pre-commit hook 来检查 repo 的最终状态?

Use git pre-commit hook to inspect the eventual state of the repo?

假设我有一个带有 pre-commit 挂钩的 git 存储库,并且我编辑了一堆文件,但我只提交了其中的一部分。或者我(错误地)在我上次将一些文件添加到提交后发生了进一步的编辑。不管它发生了什么,我对不在索引中的文件进行了编辑,因此它们可以被钩子看到但不会成为提交的一部分。如果其他人要检查该提交,则挂钩对他们来说将失败。

有没有一种简单的方法来获取与 post 提交状态相匹配的目录(即,如果要从我期望的提交中执行新的克隆,我会得到什么create) 以便挂钩可以测试 that,而不是工作目录?


认为我可以通过类似的方式破解一些东西:

OLDR=$PWD
NEWR=$(mktemp -d -t hook-XXXXXXXXXX)
HEAD=$(git rev-parse HEAD)
INDEX=$(mktemp -t hook-XXXXXXXXXX.patch)
git diff --staged > $INDEX

cd $NEWR
git clone $OLDR $NEWR
git checkout $HEAD
git apply $INDEX

...

但这似乎...不仅仅是一个 hack,而且我不确定我可以信任它在跨版本和 OS 的版本中工作的可靠性。

您需要做的是提取 Git 索引的内容,如果已设置则由 $GIT_INDEX_FILE 变量定义,否则为默认索引。

序列:

dir=$(mktemp -d)
git checkout-index --prefix=${dir}/ -a

会成功,填充新的临时目录。 (当然,这个片段不会自行清理,并且您省略了 -t 模板;它只是一个最小的演示。)

不幸的是,这种简单的方法通常是不够的,因为您通常可能还需要任何 未跟踪的 文件。要使这一切真正发挥作用非常困难。

pre-commit 描述了一个相当奇特的程序 here,它试图处理所有事情。我没有实际使用过。