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

标签 git githooks

我希望我的远程存储库拒绝任何包含包含选项卡的文件的推送,但前提是该文件属于某个类(基于文件名)。这可能吗?
我仔细查看了 githooks 中的 update hook,我认为这是正确的。

简而言之,在以下情况下应该拒绝推送:

  1. 存在所列类型的文件(*.cpp*.hCMakeLists.txt)
  2. 包含一个或多个制表符。

最佳答案

呃哦,这个问题好像漏掉了。希望你还在外面,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/

相关文章:

Git 分支重命名(非 master)- Atlassian Stash

git - git merge后如何处理xxx~HEAD?

bash - 如何实时从远程 git 仓库获取推送通知?

python - 如何在 Python Git 钩子(Hook)中使用 raw_input()?

git - 让远程 git 存储库在推送时拒绝 merge 提交

linux - 如何在 Ubuntu 20.04 中安装 Git

git - 文件 .DS_Store 和 .DS_Store 在 xcode 8 中有来自 Git 的树冲突错误

Git 工作流最佳实践

git pre-receive hook - 获取最新的代码

git - 让 Git 在提交之前自动删除尾随空格