【问题标题】:Git hook to reject commits where filename is longer than specified limitGit钩子拒绝文件名超过指定限制的提交
【发布时间】:2021-10-31 15:12:17
【问题描述】:

我希望创建一个客户端预提交 git 挂钩,如果添加到提交中的任何文件的文件名长于指定限制(例如 256),它将阻止提交。

【问题讨论】:

  • 我有文件名限制。请不要误会我的意思,你的问题没问题,你可能有正当理由这样做,我只是想说......我讨厌文件名限制......
  • 是的,我们的开发人员使用大型的超级描述文件名,而不是简短的文件名。此限制仅用于执行标准。
  • 哦,当我说“正当理由”时,我在想你有一些遗留系统会因长文件名而中断。小心点,你可能会让一些开发者对此不满意。恕我直言,这种“标准”应该是一个指导方针,讨论和解释,而不是硬执行。无论如何,我不想推测贵公司正在发生什么。
  • 哈哈是的。我的意思是作为指导方针。是的,由于文件名太长,它确实会破坏部署。
  • 您是在寻找总名称长度还是组件名称长度?也就是说,考虑thisisoneverylongpathnamethatgoesonandonandonasyoucanseethis/is/one/very/long/path/name/that/goes/on/and/on/as/you/can/see。两者都很长,但只有一个 component 很长;第二个有很多组件,每个组件都很短。

标签: git shell hook githooks


【解决方案1】:

这是一个起点:

#!/bin/sh

# .git/hooks/pre-commit
# Checks that the file about to be committed
# doesn't have a name longer than 256 characters

if test $(git diff --cached --diff-filter=A --name-only | xargs -0 basename | tr -d '\n' | wc -c) -gt 256
then
  echo "The staged file name is longer than 256 characters"
  exit 1
fi

exit 0

以下是命令的细分:

  • git diff --cached --diff-filter=A --name-only 获取暂存文件的路径
  • xargs -0 basename 对于每个路径,提取文件名
  • tr -d '\n' 删除换行符
  • wc -c 返回文件名中的字符数

如果您只有一个暂存文件,则此示例有效。您必须通过在循环中对所有分段路径运行相同的检查来进一步开发它。

【讨论】:

  • 谢谢!它按预期工作。但是有一个小问题。字符数很远,而且似乎随着每个管道符号 (|) 的增加而增加。所以,如果我的文件名+扩展名是 13 个字符,输出会说它是 15 个字符。我该如何解决这个问题?
  • 它正在计算换行符 \n 字符。我更新了我的答案。
  • 你正在总结所有添加的文件,所以如果提交添加了 1000 个文件,每个文件都有一个三个字符的名称,你的wc -c 会说有 3000 个字符(假设-to-be-single)添加的文件。那……好像不对。 :-) 此外,您可能希望禁用重命名检测,以便将重命名计为新文件,并避免用户设置,因此最好在此处直接使用git diff-index。请记住,我们想将 HEAD 与索引进行比较。
  • 我的示例仅适用于一个暂存文件,如评论中所述。这就是为什么我带头说这是一个“起点”。也许这并不明显,所以我澄清了这一点。 OP 必须通过对所有分段路径运行相同的检查来进一步开发它。
猜你喜欢
  • 1970-01-01
  • 2012-10-19
  • 2018-05-21
  • 1970-01-01
  • 2012-05-12
  • 2020-06-04
  • 2019-12-26
  • 1970-01-01
  • 2013-12-15
相关资源
最近更新 更多