使用 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,它试图处理所有事情。我没有实际使用过。
假设我有一个带有 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,它试图处理所有事情。我没有实际使用过。