我希望我的远程存储库拒绝任何包含包含选项卡的文件的推送,但前提是该文件属于某个类(基于文件名)。这可能吗?
我仔细查看了 githooks 中的 update hook
,我认为这是正确的。
简而言之,在以下情况下应该拒绝推送:
- 存在所列类型的文件(
*.cpp
、*.h
、CMakeLists.txt
) - 包含一个或多个制表符。
最佳答案
呃哦,这个问题好像漏掉了。希望你还在外面,Esben!
您正在寻找 update hook ,它为每个更新的 ref 运行一次。参数是 ref 的名称、旧对象名称(提交 SHA1)和新对象名称。
因此,您真正需要做的就是检查新旧版本之间的差异,并确保它符合您的标准。当然,这并不完全简单,但它是完全可控的。这是我要做的:
将以下脚本保存到.git/hooks/update
。
old=$2
new=$3
# that's a literal tab, because (ba)sh turns \t into t, not a tab
# make sure your editor doesn't expand it to spaces
git diff --name-only $old $new | egrep '(\.(cpp|h)$)|^CMakeLists.txt$' | xargs -d'\n' git diff -U0 $old $new -- | grep -q '^+.* ' && exit 1
它列出了所有新旧文件之间的差异,对所有需要的文件进行 grep,获取它们的差异(上下文行为零,因为我们不关心),对添加的行进行 grep (以包含制表符的 +
) 开头。如果 grep 找到一个成功退出,这将使 &&
运行 exit 1
,导致 hook 退出失败并中止更新!
请注意,这与您的要求略有不同 - 它会检查差异是否添加任何制表符。从长远来看,这可能更好;一旦您确定您现有的代码没问题,它就是一回事,只是速度要快得多,因为它不必搜索所有内容。
关于git - 防止推送到某些文件中包含选项卡的 git(例如 *.cpp、*.h、CMakeLists.txt),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3985463/