【发布时间】:2011-12-14 14:44:02
【问题描述】:
对于修改暂存文件的预提交挂钩,我需要弄清楚在运行挂钩后必须暂存的内容。
预提交钩子在应该提交的文件上应用了一些漂亮的打印。该钩子执行以下任务:
- 用空格替换制表符
- 删除行尾的尾随空格
- 删除双空行*)
- 如果缺少,在文件末尾添加一个空行*)
标有 *) 的操作是导致下述问题的操作。
完成这些之后,钩子使用git add $filename 将修改后的文件添加到索引中。这样,整个文件就会被暂存,我不再能够只提交修改后文件的一小部分(即大块)。
当然,我可以git add --no-verify 绕过钩子,但使用git gui 时该选项不可用。另外,我想要在文件的分段行上应用漂亮的打印,所以绕过钩子不是我的目标。
有没有办法在应用漂亮打印后找出必须添加到索引中的内容,以便我可以在运行钩子后暂存 right 内容,而不是暂存整个文件?
编辑 1:
虽然David Brigada 提供的answer 看起来很有希望,但它不起作用:git stash --keep-index 保持分阶段的变化完好无损(这是好的部分),但是(至少在 msysgit 上)它把 all 更改为 stash(不仅是未暂存的)。这会在将存储弹出回 WC 时导致合并冲突,因为暂存的行可能会被修改。
编辑 2:
David 的更新答案也没有成功,因为 git 拒绝将存储合并到脏 WC。
编辑 3:
来自larsks 的answer 指向了.gitattributes 的用法。乍一看,这似乎是正确的,但我发现签入的版本是通过过滤器运行的,而 WC 与签入的版本不同,这很令人困惑。至少,这是我的经验,Git Book 中的以下评论支持:
如果您提交这些更改并再次签出文件,您会看到正确替换的关键字
我必须删除文件,然后再次检查才能查看过滤器应用的更改?没门!还有更多提示吗?
【问题讨论】:
标签: git hook pre-commit