我需要设置一个预提交触发器,以防止某些文件类型被提交到我的 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 更强大的功能。
另一方面,更新钩子将控制可以推送到你的(主)仓库。这里有一个例子这里基于检查文件内容,您可以改为检查文件名。