在回答previous question后,我实现了一个Git钩子脚本,每当工作目录更新时都需要触发。我将此脚本链接到.git / hooks中的以下内容:
这主要起作用,但并非总是如此。我找到的一个案例是git stash
。这是一个问题,因为我的钩子生成了一个文本文件,我也用git update-index --assume-unchanged
标记告诉Git我不想签入更改(签入一个空版本)。但是,git stash
将恢复假定未更改的文件(到空文件),这意味着钩子需要再次运行,但在git stash
之后不会调用钩子。
我怀疑git rebase
也可能存在类似的问题,但这并不容易解释。
我想要一个Git将在更新工作目录后总是运行的钩子。这可能吗?
答案 0 :(得分:1)
不确定git stash pop
(我在“Is there a way with to prevent “git stash pop” from marking files as modified?”中提供了一些替代方案。)
git update-index
附带了另一个选项--skip-worktree
,可能会避免git存储问题
请参阅“Git - Difference Between 'assume-unchanged
' and 'skip-worktree
'”
但对于git rebase
,您可能会对 post-rewrite
hook 感兴趣:
这个钩子由重写提交的命令调用(
git commit --amend
,git-rebase
;当前git-filter-branch
没有调用它!)。
它的第一个参数表示它被调用的命令:当前是修改或rebase之一。将来可能会传递更多与命令相关的参数。钩子接收stdin上重写提交的列表,格式为
<old-sha1> SP <new-sha1> [ SP <extra-info> ] LF
extra-info
再次依赖于命令。如果为空,则也省略前面的SP。目前,没有命令传递任何额外信息。