git - 运行预提交 Hook 后要暂存什么?

标签 git hook pre-commit

对于修改暂存文件的预提交 Hook ,我需要弄清楚 Hook 运行后必须暂存的内容。

预提交 Hook 对应该提交的文件应用了一些 pretty-print 。该 Hook 执行以下任务:

  • 用空格替换制表符
  • 删除行尾的尾随空格
  • 删除双空行*)
  • 如果缺少,在文件末尾添加一个空行 *)

标有 *) 的操作会导致下述问题。

完成这些之后, Hook 使用 git add $filename 将修改后的文件添加到索引中.这样,整个文件就会暂存,我不能再只提交修改后文件的一小部分(即大块)。

当然,我可以git add --no-verify并绕过钩子(Hook),但使用 git gui 时该选项不可用.此外,我希望在文件的暂存行上应用 pretty-print ,因此绕过钩子(Hook)不是我的目标。

有没有办法找出在应用 pretty-print 后必须添加到索引中的内容,以便我可以在运行 Hook 后暂存正确的内容而不是暂存整个文件?


编辑 1:
answerDavid Brigada 提供看起来很有希望,但它不起作用:git stash --keep-index保留暂存更改完好无损(这是好的部分),但是(至少在 msysgit 上)它将所有更改放入存储中(不仅是未暂存的更改)。这会导致在将存储 pop 回 WC 时发生 merge 冲突,因为分阶段的行可能会被修改。


编辑 2:
也是 David 的更新答案导致没有成功,因为 git 拒绝将存储 merge 到一个脏的 WC 中。


编辑 3:
answer来自 larsks指出 .gitattributes 的用法.乍一看,这似乎是正确的,但我发现很困惑,因为 checkin 版本是通过过滤器运行的,而且 WC 与 checkin 版本不同。至少,这是我的经验,并得到 Git Book 中以下评论的支持。 :

If you commit those changes and check out the file again, you see the keyword properly substituted

我必须删除文件然后再次检查才能看到过滤器应用的更改?不可能!还有更多提示吗?

最佳答案

我不确定预提交 Hook 是否适合执行此类工作。 Git 有一个过滤机制,允许您通过 .gitattributes 将提交/ check out 过滤器应用于文档; Pro Git Book包括使用此过滤机制自动将 indent 程序应用于 C 源文件的示例。

关于git - 运行预提交 Hook 后要暂存什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8506334/

相关文章:

git - TortoiseGit 和 Pageant,每次都必须为 "add key"

php - 如何在不编辑主文件的情况下在网站页面上添加当前版本号

reactjs - Bitbucket 管道无法推送到 heroku

git - 如何让 Git 提交历史显示在 Redmine 问题跟踪器上

javascript - Ember CLI Hook /事件错误

php - WooCommerce 产品图像缩放选项的可用参数详细信息

python - 不能使 SVN 预提交脚本与 Windows 服务器失败

git - prod 上的 .htaccess 文件并在 git 中跟踪,不想在 dev 上使用 prod 的 .htaccess

githooks - 指定在 git commit --no-verify 上跳过哪个钩子(Hook)

visual-studio-2013 - checkin TFS 2013 之前的代码审查