运行预提交挂钩后要播放什么?

eck*_*kes 7 git hook pre-commit

对于修改分阶段文件的预提交钩子,我需要弄清楚钩子运行后必须暂存的内容.

预提交钩子对应该提交的文件应用一些漂亮的打印.钩子执行以下任务:

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

标有*)的操作是导致下述问题的操作.

完成这些操作后,钩子会将修改后的文件添加到索引中git add $filename.这样,整个文件上演了,我不再只能提交修改后的文件的一小部分(即帅).

当然,我可以git add --no-verify绕过钩子,但是当使用时,该选项不可用git gui.此外,我希望在文件的分段行上应用漂亮的打印,所以绕过钩子不是我的目标.

有没有办法找出在应用漂亮打印后必须添加到索引中的内容,这样我可以在挂钩运行后播放正确的内容而不是暂存整个文件?


编辑1:
虽然David Brigada提供的答案看起来很有希望,但它不起作用:保持分阶段的变更完整(这是好的部分),但(至少在msysgit上)它将所有更改放入存储(不仅是未分级的)那些).当将存储重新弹回WC时,这会导致合并冲突,因为可能会修改分段行.git stash --keep-index


编辑2:David
的更新答案也没有成功,因为git拒绝将存储合并到脏WC中.


编辑3:来自larsks
回答指出了我的用法.在第一眼看来,这似乎是正确的,但我发现签入的版本是通过过滤器运行并且WC与签入版本不同,这让我很困惑.至少,这是我的经验,并得到Git Book中以下评论的支持:.gitattributes

如果您提交这些更改并再次签出该文件,您会看到正确替换关键字

我必须删除该文件,然后再次检查以查看过滤器应用的更改?没门!还有什么提示吗?

lar*_*sks 2

我不确定预提交挂钩是否是执行此类工作的正确位置。.gitattributesGit 有一个过滤机制,允许您通过;将提交/签出过滤器应用于文档。Pro Git Book包含使用此过滤机制将indent程序自动应用于 C 源文件的示例。