【问题标题】:Git hook for any action that updates the working directory用于更新工作目录的任何操作的 Git 挂钩
【发布时间】:2013-08-23 02:10:35
【问题描述】:

在回答previous question 之后,我实现了一个 Git 挂钩脚本,只要工作目录更新,就需要触发该脚本。我将此脚本链接到 .git/hooks 中的以下内容:

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

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

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

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

【问题讨论】:

  • 你试过git update-index --skip-worktree,看看文件是否也受到 git stash 的影响?
  • 我不知道--skip-worktree。现在我已经尝试过了,它似乎确实做了我想要的。如果您将其添加到您的答案中,我会接受。

标签: git githooks


【解决方案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 stash 问题。
见“Git - Difference Between 'assume-unchanged' and 'skip-worktree'


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

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

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

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

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

【讨论】:

  • 我尝试了post-rewrite,并没有解决git stash的问题(注意,即使git stash也是一个问题,不仅仅是git stash pop)。所以谢谢你的提示,我以后可能会用它来变基,但我仍然需要一个隐藏的解决方案。
  • @JohnZwinck 我同意。我的答案是“git rebase”部分。我只提供 git stash 的链接,但没有任何结论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 2015-07-03
  • 2012-06-10
  • 2012-05-18
  • 1970-01-01
  • 2011-12-16
  • 2015-04-22
相关资源
最近更新 更多