GitHub:尝试使用预提交钩子来阻止用户签入某些文件类型,钩子不起作用

GitHub:尝试使用预提交钩子来阻止用户签入某些文件类型,钩子不起作用

我需要设置一个预提交触发器,以防止某些文件类型被提交到我的 GitHub 存储库。我已经设置了 .gitignore,它可以正常工作,但可以使用标志覆盖-f。我想将其锁定,这样就不会强制执行。

我进入.git/hooks并将 pre-commit.sample 重命名为 pre-commit,然后使用此命令尝试阻止使用 .txt 文件:

git ls-files --cached | grep -qx 'txt$' && { echo "This file type is forbidden" >&2; exit 1; }

我的理由是这样的:

git ls-files --cached获取要提交的缓存文件列表

| grep -qx 'txt$'过滤所有以 'txt' 结尾的文件但不将列表输出到屏幕

&& { echo "This file type is forbidden"告诉用户没有 .txt 文件

>&2; exit 1; }管道传输到 stderr,错误转义,因此不会发生提交

exit 0如果未找到模式,则继续提交。

这与这个问题类似:使用 Git 将文件标记为“不可提交”

但是,这个问题并没有解决我的问题,因为那里的解决方案实际上并不适用于我想要做的事情。触发器似乎只有在没有参数的情况下才会起作用,git commit但即使是参数也会-m "commit message"使其失败。

即使钩子确实触发,我仍然可以将 .txt 文件添加到暂存区,提交它,然后将其推送到我的远程。 为什么预提交触发器无法阻止提交?

答案1

你所追求的实际上是更新钩。

您的提交钩子似乎需要进行调整才能工作,但无论如何,提交钩子只会阻止用户提交到他们自己的(远程)存储库。

由于这是他们自己的仓库,他们可以简单地更改钩子以允许他们的提交,然后推送到您的仓库。因此,这不会给您提供比 .gitignore 更强大的功能。

另一方面,更新钩子将控制可以推送你的(主)仓库。这里有一个例子这里基于检查文件内容,您可以改为检查文件名。

相关内容