配置 git 以在使用分支名称中的某些字符时抛出错误

Configure git to throw error on using certain characters in branch name

我最近发现,如果您的分支在分支名称中包含 /,我的组织的构建过程将无法成功,因为构建过程会生成一个文件名为 <blah>_<branch_name>.type 的文件文件夹说 RootFolder。

例如。分支名称:dev/someDev/someBranch

   FileName: `<blah>_dev/someDev/someBranch.type`

由于分支名称包含/,文件实际上是在RootFolder\<blah>_dev\someDev\创建的,文件名为someBranch.type。 现在需要 RootFolder 中的文件的进程找不到导致构建过程失败的文件。

那么,有没有一种方法可以配置 git 在分支名称包含某些非法字符的情况下抛出错误?

注意:此时我无法更改构建过程。另外,我知道还有其他几种命名分支的方法:dev-someDev-someBranch 通过它我们可以避免遇到此构建失败,但我很好奇是否可以按上述方式配置 git。

好吧,您没有告诉我们您希望根据您的策略检查分支名称的位置 - 在开发人员的机器上或在他们推送到的存储库中或在您的构建服务器提取到(如果有的话)或其他地方完全的存储库中。

我认为这种检查最简单的配置点是开发人员将他们的工作推送到的存储库。

要实施此类策略实施,您需要在该存储库中编写并启用所谓的 hook;具体来说,一个 pre-receive 钩子。

挂钩是 Git 在存储库上执行特定操作时调用的脚本(或任何其他类型的可执行程序)。请参阅 git help hooks 阅读概述。每个挂钩必须遵循一定的约定才能与 Git 一起使用。通常钩子从它们的标准输入流中读取 Git 提供的数据,不向它们的标准输出流写入任何内容,并通过以状态码 0 和失败(或 "not OK continue") 通过以非零退出代码退出;在后一种情况下,他们可能会将错误消息写入其标准错误流。

感兴趣的钩子,pre-receive这样滚动:

pre-receive This hook is invoked by git-receive-pack on the remote repository, which happens when a git push is done on a local repository. Just before starting to update refs on the remote repository, the pre-receive hook is invoked. Its exit status determines the success or failure of the update.

This hook executes once for the receive operation. It takes no arguments, but for each ref to be updated it receives on standard input a line of the format:

<old-value> SP <new-value> SP <ref-name> LF

where <old-value> is the old object name stored in the ref, <new-value> is the new object name to be stored in the ref and <ref-name> is the full name of the ref. When creating a new ref, <old-value> is 40 0.

If the hook exits with non-zero status, none of the refs will be updated. If the hook exits with zero, updating of individual refs can still be prevented by the update hook.

Both standard output and standard error output are forwarded to git send-pack on the other end, so you can simply echo messages for the user.

因此,您需要编写一个钩子程序,从其标准输入流中读取数据,将其解释为一组 LF 分隔的行, 将每个分成三个字段,由两个 SP (space) 个字符分隔 并检查第三个字段——这将是一个分支名称——没有 根据您的政策,无效字符。

如果您的钩子检测到违反策略,它应该向其标准错误流写入一条消息并以非零退出代码退出。 这将使 Git 不使用开发人员的数据更新存储库 试图推入其中。