1

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

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


我可以通过以下方式一起破解一些东西:

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

...

但这似乎......不仅仅是一个黑客,我不确定我可以多么可靠地相信它可以跨版本和操作系统工作。

4

1 回答 1

2

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

序列:

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

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

不幸的是,这种简单的方法通常是不够的,因为您通常还需要任何未跟踪的文件。让这一切都很好地工作是相当困难的。

这里pre-commit描述了一个相当花哨的程序,它试图处理所有事情。我实际上并没有使用它。

于 2021-07-07T18:54:14.390 回答