使用 Husky 设置预推钩子以防止推送到 master 分支
Setup pre-push hook with Husky to prevent pushing to master branch
是否可以用Husky设置pre-push hook,防止误推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"
]
}
}
尝试将您的预推挂钩更改为:"npm run lint && git branch | grep \"*\" | egrep -v \"^* master$\""
当当前分支为master
时,这将导致git push
失败
我所做的是制作一个 pre-push bash 脚本并将其提交到存储库中。然后使用 husky 参数从 husky pre-push 钩子调用此脚本。
这是我在里面的哈士奇配置package.json(可以单独配置)
"husky": {
"hooks": {
"pre-commit": "./commands/pre-commit",
"pre-push": "./commands/pre-push $HUSKY_GIT_STDIN"
}
},
如您所见,我有 2 个脚本,一个用于 pre-push,一个用于 pre-commit。
这是我的 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 [[ != *"$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
脚本基本上会做两件事:
- 这个脚本将阻止任何试图推送到某个分支的人(在我的例子中,我不希望任何人——包括我自己——直接推送到
master
和 develop
分支)。他们需要在自己的分支中工作,然后创建拉取请求。
- 此脚本将阻止任何试图推送到与其当前活动分支不同的分支的人。例如,您在分支
fix/someissue
中,但随后您错误地键入了 git push origin master
.
有关更详细的说明,您可以参考这篇文章:
https://github.com/talenavi/husky-precommit-prepush-githooks
是否可以用Husky设置pre-push hook,防止误推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"
]
}
}
尝试将您的预推挂钩更改为:"npm run lint && git branch | grep \"*\" | egrep -v \"^* master$\""
当当前分支为master
时,这将导致git push
失败
我所做的是制作一个 pre-push bash 脚本并将其提交到存储库中。然后使用 husky 参数从 husky pre-push 钩子调用此脚本。
这是我在里面的哈士奇配置package.json(可以单独配置)
"husky": {
"hooks": {
"pre-commit": "./commands/pre-commit",
"pre-push": "./commands/pre-push $HUSKY_GIT_STDIN"
}
},
如您所见,我有 2 个脚本,一个用于 pre-push,一个用于 pre-commit。
这是我的 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 [[ != *"$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
脚本基本上会做两件事:
- 这个脚本将阻止任何试图推送到某个分支的人(在我的例子中,我不希望任何人——包括我自己——直接推送到
master
和develop
分支)。他们需要在自己的分支中工作,然后创建拉取请求。 - 此脚本将阻止任何试图推送到与其当前活动分支不同的分支的人。例如,您在分支
fix/someissue
中,但随后您错误地键入了git push origin master
.
有关更详细的说明,您可以参考这篇文章:
https://github.com/talenavi/husky-precommit-prepush-githooks