Git pre-commit 钩子来检查文件变化的数量
Git pre-commit hook to check number of files changing
我们的存储库有自定义状态检查,这些检查会根据我们更改的文件数量触发。如果单个 PR 中更改的文件数量很大,这些状态检查可以降低下游依赖性。 (在这些状态检查中有对服务的请求)。我在这里不是要争论这些状态检查以及为什么它们首先在那里,在这个时间点我们不能改变它或扩展服务来处理这样的负载。
控制这些大变化的想法是在预提交上添加一个 git 挂钩,它基本上获取当前分支和远程主控端之间不同的文件数量。然后如果这些文件的数量大于一定数量,我们想报错。
基本上我要解决这个问题的方法是在 git 挂钩
中使用以下命令
# Refresh local reference to origin/HEAD
git fetch
# Get the diff between the tip of current branch and the tip of origin/HEAD and count them
git diff --name-only --cached origin/HEAD | wc -l
...
这似乎可行,但我有几个问题:
1.这些方法有什么隐藏的陷阱吗?我想确保我涵盖了所有我们可以防止打开拉取请求的情况,差异跨越文件数 > X。
2. 在 git 钩子中调用 git fetch 安全吗?我需要一些方法来确保本地引用 origin/HEAD 不会过时,否则挂钩不会失败,但如果本地主控已过时,拉取请求仍可能具有非常大的差异。
是的,这里隐藏的问题是此服务 运行 在开发人员机器上,这意味着您的 CI 系统的完整性取决于开发人员安装 CI 的意愿和能力=10=] 挂钩而不覆盖它。正如之前在这里和其他地方提到的那样,不可能依赖 pre-commit
挂钩来执行策略,因为开发人员机器不受信任。
最好将其放入 CI 脚本中,如果更改量很大,则尽早失败。您的 CI 系统是做出政策决定的正确场所,即使这些政策决定是要放弃而不是 运行 其余 CI 工作。或者,如果您的 Git 服务器支持 pre-receive
挂钩,您可以在那里完成工作。
此外,pre-commit
这样的挂钩使得高级用户很难创建一系列逻辑提交,甚至很难创建修复提交以压缩到较旧的提交中。作为这样的用户,如果每次我想添加一些提交时都必须等待获取,我会 非常 不高兴,我希望您的用户会删除挂钩或强制使用--no-verify
.
话虽如此,它不会破坏在 pre-commit
挂钩中获取任何东西,尽管您会发现这样做会破坏用户对 git push --force-with-lease
的使用,以及可能令人困惑的编辑器集成。
我们的存储库有自定义状态检查,这些检查会根据我们更改的文件数量触发。如果单个 PR 中更改的文件数量很大,这些状态检查可以降低下游依赖性。 (在这些状态检查中有对服务的请求)。我在这里不是要争论这些状态检查以及为什么它们首先在那里,在这个时间点我们不能改变它或扩展服务来处理这样的负载。
控制这些大变化的想法是在预提交上添加一个 git 挂钩,它基本上获取当前分支和远程主控端之间不同的文件数量。然后如果这些文件的数量大于一定数量,我们想报错。
基本上我要解决这个问题的方法是在 git 挂钩
中使用以下命令
# Refresh local reference to origin/HEAD
git fetch
# Get the diff between the tip of current branch and the tip of origin/HEAD and count them
git diff --name-only --cached origin/HEAD | wc -l
...
这似乎可行,但我有几个问题: 1.这些方法有什么隐藏的陷阱吗?我想确保我涵盖了所有我们可以防止打开拉取请求的情况,差异跨越文件数 > X。 2. 在 git 钩子中调用 git fetch 安全吗?我需要一些方法来确保本地引用 origin/HEAD 不会过时,否则挂钩不会失败,但如果本地主控已过时,拉取请求仍可能具有非常大的差异。
是的,这里隐藏的问题是此服务 运行 在开发人员机器上,这意味着您的 CI 系统的完整性取决于开发人员安装 CI 的意愿和能力=10=] 挂钩而不覆盖它。正如之前在这里和其他地方提到的那样,不可能依赖 pre-commit
挂钩来执行策略,因为开发人员机器不受信任。
最好将其放入 CI 脚本中,如果更改量很大,则尽早失败。您的 CI 系统是做出政策决定的正确场所,即使这些政策决定是要放弃而不是 运行 其余 CI 工作。或者,如果您的 Git 服务器支持 pre-receive
挂钩,您可以在那里完成工作。
此外,pre-commit
这样的挂钩使得高级用户很难创建一系列逻辑提交,甚至很难创建修复提交以压缩到较旧的提交中。作为这样的用户,如果每次我想添加一些提交时都必须等待获取,我会 非常 不高兴,我希望您的用户会删除挂钩或强制使用--no-verify
.
话虽如此,它不会破坏在 pre-commit
挂钩中获取任何东西,尽管您会发现这样做会破坏用户对 git push --force-with-lease
的使用,以及可能令人困惑的编辑器集成。