在git中央仓库中,当特定文件被推送到仓库时,我需要忽略对它们的更改。我不想拒绝(失败)整个推送,而是简单地忽略这些更改。是否有一个git钩子,我可以使用它来简单地过滤掉一些更改?
我考虑过使用过滤器,但我不确定它们是否会在中央回购中使用,因为它是"裸露的",例如。,没有工作副本。
详细信息:在类似的场景中,数十个开发人员正在对这些文件进行更改。我尝试在中央仓库上使用git update-index—assume-unchanged,但是它会被"偏离"的开发人员每次推送重置,然后在他们拉时传播给其他开发人员。我不可能一次改变所有开发者的仓库。我想在中央仓库上做一次更改,然后忽略对这些文件的更改。
不能这样做,因为从提交中排除文件会改变哈希值。我的意思是你可以这样做,但你绝对不想这样做。
在你的情况下,最合理的解决方案实际上是拒绝那些修改了那些有意义的错误的文件的提交,比如"你不能修改以下文件:…",并教育你的提交者。
这在技术上是可能的,但它带来了巨大的实际麻烦(更不用说钩子的编写相当麻烦):客户端仍然拥有未过滤的历史记录,因此在下一次推送时,它会在客户端看起来好像服务器拥有与自己完全不同的历史记录。用户最终会将经过过滤的历史与未经过过滤的历史合并在一起,在推送时,这些历史又会被你的钩子过滤掉,故事就会不断重复。
由于这个原因,通常最好是拒绝这个钩子,或者让所有的开发人员安装一个做类似事情的预提交钩子。
如果你喜欢痛苦,这里有一个如何在预接收/更新钩子中做到这一点的大纲:
- 检查,使用涉及
git rev-list
的东西,是否有任何有问题的文件被触摸。如果没有,就退出吧,因为接下来的步骤将是相当痛苦的。 - 暂时检出推送之前的历史记录(这可能使用
git-new-workdir
贡献脚本)。 - 找出新提交的列表
- 应用它们中的每一个,立即修改这些文件的更改。
- 取消临时结帐。
- 更新分支,并使用非零代码使钩子退出(这会导致向用户显示错误,但您可以同时发送一个不错的消息)。这可以防止正常的推送过程更新分支本身并取消您的辛苦工作。