使用 Husky 设置预推送钩子以防止推送到 master 分支

p7a*_*ams 5 javascript git github eslint git-husky

是否可以使用 Husky 设置预推送挂钩以防止错误推送到 master?Husky 文档非常差,所以我找不到答案。

现在我已经准备好了像这样的承诺和推动:

 "husky": {
    "hooks": {
      "pre-commit": "lint-staged",
      "pre-push": "npm run lint"
    }
  },
  "lint-staged": {
    "linters": {
      "*.{js,json,scss,md}": [
        "prettier --write",
        "git add"
      ],
      "*.js": [
        "eslint -c .eslintrc --fix",
        "echo test",
        "git add"
      ]
    }
  }
Run Code Online (Sandbox Code Playgroud)

ack*_*inc 6

尝试将您的预推挂钩更改为:"npm run lint && git branch | grep \"*\" | egrep -v \"^* master$\""

git push当当前分支是master时这会导致失败


小智 4

我所做的是制作一个预推送 bash 脚本并将其提交到存储库中。然后使用 husky 参数从 husky 预推送挂钩调用此脚本。

这是我在 package.json 中的 husky 配置(如果需要,您可以设置单独的配置)

"husky": {
    "hooks": {
        "pre-commit": "./commands/pre-commit",
        "pre-push": "./commands/pre-push $HUSKY_GIT_STDIN"
    }
},
Run Code Online (Sandbox Code Playgroud)

如您所见,我有 2 个脚本,一个用于预推送,一个用于预提交。

这是我的commands/pre-push脚本

#!/bin/bash

echo -e "===\n>> Talenavi Pre-push Hook: Checking branch name / Mengecek nama branch..."

BRANCH=`git rev-parse --abbrev-ref HEAD`
PROTECTED_BRANCHES="^(master|develop)"

if [[ $1 != *"$BRANCH"* ]]
then
  echo -e "\n You must use (git push origin $BRANCH) / Anda harus menggunakan (git push origin $BRANCH).\n" && exit 1
fi

if [[ "$BRANCH" =~ $PROTECTED_BRANCHES ]]
then
  echo -e "\n Cannot push to remote $BRANCH branch, please create your own branch and use PR."
  echo -e " Tidak bisa push ke remote branch $BRANCH, silahkan buat branch kamu sendiri dan gunakan pull request.\n" && exit 1
fi

echo -e ">> Finish checking branch name / Selesai mengecek nama branch.\n==="

exit 0
Run Code Online (Sandbox Code Playgroud)

该脚本基本上会做两件事:

  • 该脚本将阻止任何试图推送到某个分支的人(在我的例子中,我不希望任何人 - 包括我自己 - 直接推送到master某个develop分支)。他们需要在自己的分支中工作,然后创建拉取请求。
  • 该脚本将阻止任何尝试推送到与当前活动分支不同的分支的人。例如,您在分支中fix/someissue,但您错误地输入了git push origin master

有关更详细的说明,您可以按照本文进行操作:
https://github.com/talenavi/husky-precommit-prepush-githooks