防止推到包含某些文件中的选项卡的git(例如*.cpp、*.h、CMakeLists.txt)

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (50)

我希望我的远程存储库拒绝包含包含选项卡的文件的任何推送,但前提是该文件属于某个类(基于文件名)。这有可能吗?

我看了看update hook我认为这是正确的。

因此,简言之,如果:

  1. 有一个所列类型的文件(*.cpp,,,*.h,,,CMakeLists.txt)
  2. 包含一个或多个制表符的。
提问于
用户回答回答于

你在找一个更新,它对每个更新的引用运行一次。参数是Ref的名称、旧的对象名称(COMMIT SHA 1)和新的对象名称。

所以,真正需要做的就是检查新旧之间的差异,并确保它符合您的标准。当然,这并不是完全简单的,但它是完全可以管理的。我会这样做:

将以下脚本保存到.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找到成功,grep将退出成功,这将使&&exit 1,导致钩子退出失败并中止更新!

请注意,这与需求略有不同-它检查diff是否添加了任何选项卡字符。从长远来看,这可能会更好;一旦您确保了现有代码的正常运行,这是相同的事情,只是速度要快得多,因为它不需要搜索所有内容。

用户回答回答于

可以设置一个预推钩,但这并不是真正符合GIT出版机制的精神。

我宁愿选择:

pre-commit hook,防止任何错误内容的提交。

或者是filter driver可以轻松地与正确的文件类型相关联,并且可以修复或报告任何不正确的内容。

扫码关注云+社区