对于修改暂存文件的预提交 Hook ,我需要弄清楚 Hook 运行后必须暂存的内容。
预提交 Hook 对应该提交的文件应用了一些 pretty-print 。该 Hook 执行以下任务:
- 用空格替换制表符
- 删除行尾的尾随空格
- 删除双空行*)
- 如果缺少,在文件末尾添加一个空行 *)
标有 *) 的操作会导致下述问题。
完成这些之后, Hook 使用 git add $filename
将修改后的文件添加到索引中.这样,整个文件就会暂存,我不能再只提交修改后文件的一小部分(即大块)。
当然,我可以git add --no-verify
并绕过钩子(Hook),但使用 git gui
时该选项不可用.此外,我希望在文件的暂存行上应用 pretty-print ,因此绕过钩子(Hook)不是我的目标。
有没有办法找出在应用 pretty-print 后必须添加到索引中的内容,以便我可以在运行 Hook 后暂存正确的内容而不是暂存整个文件?
编辑 1:
而 answer由 David 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/