2

在对上一个问题的回答之后,我实现了一个 Git 挂钩脚本,每当更新工作目录时都需要触发该脚本。我将此脚本链接到 .git/hooks 中的以下内容:

  • 结帐后
  • 提交后
  • 合并后

这通常有效,但并非总是如此。我发现的一个案例是git stash。这是一个问题,因为我的钩子生成了一个文本文件,我还用它标记git update-index --assume-unchanged告诉 Git 我不想签入更改(签入一个空版本)。但是,git stash将恢复假设未更改的文件(到空文件),这意味着钩子需要再次运行,但在git stash.

我怀疑也可能存在类似的问题git rebase,但这并不容易解释。

我想要一个在更新工作目录后Git 将始终运行的钩子。这可能吗?

4

1 回答 1

1

不确定git stash pop(我在“有没有办法防止“git stash pop”将文件标记为已修改? ”中提供了一些替代方法)。

git update-index带有另一个选项--skip-worktree,可以避免 git stash 问题。
请参阅“ Git - ' assume-unchanged' 和 ' skip-worktree'之间的区别”


但是对于git rebase,您可能对post-rewrite钩子感兴趣:

这个钩子由重写提交的命令调用(git commit --amend, git-rebase; 当前git-filter-branch不调用它!)。
它的第一个参数表示它被调用的命令:当前是 amend 或 rebase 之一。将来可能会传递更多与命令相关的参数。

钩子接收标准输入上重写提交的列表,格式为

<old-sha1> SP <new-sha1> [ SP <extra-info> ] LF

extra-info再次依赖于命令。如果为空,则前面的 SP 也被省略。目前,没有命令传递任何额外信息。

于 2013-08-23T06:10:47.973 回答