【问题标题】:Use git pre-commit hook to inspect the eventual state of the repo?使用 git pre-commit hook 来检查 repo 的最终状态?
【发布时间】:2021-07-07 18:47:44
【问题描述】:

假设我有一个带有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

...

但这似乎......不仅仅是一个黑客,我不确定我是否可以信任它在不同版本和操作系统上工作的可靠性。

【问题讨论】:

    标签: git pre-commit-hook


    【解决方案1】:

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

    顺序:

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

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

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

    有一个名为pre-commit 描述here 的相当花哨的程序试图处理所有事情。我没有实际使用过。

    【讨论】:

    • 实际上,我会考虑将未跟踪的文件排除为功能而不是错误,因为它们不会出现在生成的提交中。 ...除非您说不包含已提交的文件?
    • 不管你想要什么,这似乎都有效。
    • 我的意思是:很多人希望构建包含未跟踪的“下一个版本号”文件,或者其他位于工作树中的文件。由于此方法会创建一个空目录,然后仅提取要提交的文件,因此它们不会获取这些文件。如果这就是您想要的,那太好了!如果没有,那么,那就是不够用了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2017-01-18
    • 2015-08-19
    • 2013-02-19
    • 2013-10-17
    • 1970-01-01
    相关资源
    最近更新 更多