2

在中央 git 存储库中,当特定文件被推送到存储库时,我需要忽略它们的更改。我不想拒绝(失败)整个推送,而只是忽略这些更改。有没有我可以使用的 git hook 来过滤掉一些变化?

我考虑过使用过滤器,但我不确定它们是否会在中央回购中使用,因为它是“裸露的”,例如,没有工作副本。

详细信息:在与此类似的场景中,数十名开发人员正在推送对这些文件的更改。我尝试在中央存储库上使用git update-index --assume-unchanged,但它会被“流浪”开发人员所做的每次推送重置,然后在他们拉出时传播给其他开发人员。我不能一次更改所有开发人员的存储库。我想在中央存储库上进行一次更改,然后忽略对这些文件的更改。

4

2 回答 2

1

你根本不能这样做,因为从提交中排除文件会改变哈希值。我的意思是你可以这样做,但你绝对不想要它。

在您的情况下,最合理的解决方案实际上是拒绝那些修改这些文件并出现有意义的错误的提交,例如“您无法修改以下文件:......”并教育您的提交者。

于 2013-06-13T09:43:47.980 回答
0

这在技术上是可行的,但它带来了巨大的实际麻烦(更不用说钩子写起来相当麻烦):客户端仍然有未过滤的历史记录,因此在下一次推送时,它会像服务器一样查看客户端有着与自己完全不同的历史。用户最终会将过滤后的历史记录与未过滤的历史记录合并,在推送时,这又会被您的钩子过滤,故事将继续重复。

出于这个原因,通常最好拒绝该钩子或让所有开发人员安装一个可做类似事情的预提交钩子。

如果您喜欢痛苦,以下是如何在预接收/更新挂钩中进行操作的概述:

  • 检查,使用涉及的东西git rev-list,是否有任何有问题的文件被触及。如果没有,就退出,因为接下来的步骤将非常痛苦。
  • 临时签出推送之前的历史记录(这可能使用git-new-workdircontrib 脚本)。
  • 找出新提交的列表。
  • 应用它们中的每一个,立即修改对相关文件的更改。
  • 摆脱临时结帐。
  • 更新分支,并使用非零代码使钩子退出(这会导致向用户显示错误,但您可以发送一条很好的消息)。这可以防止正常的推送过程更新分支本身并取消您的辛勤工作。
于 2013-06-13T09:43:36.510 回答