git拒绝在master上直接提交代码

在master上直接提交不是一个好习惯

对于个人项目,只有一个分支的情况下,无可厚非,随便折腾,但是当多人合作时,直接在master提交代码往往会容易参杂不同的进度的代码,容易给项目管理造成混乱。

所以我们需要一种工具,来禁止我们直接在master分支上commit代码,而合并则是可以的。

hooks

这就需要利用到git hooks工具了,在.git/hooks/pre-commit文件内,写入如下代码:

1
2
3
4
5
6
7
8
9
10
#!/bin/sh
#本脚本阻止在master commit代码
branch="$(git rev-parse --abbrev-ref HEAD)"
if [ "$branch" = "master" ]; then
echo "Hey bitch, You can't commit code to master branch!"
exit 1
fi

就能阻止你直接在master或dev上提交代码了。

插曲

当我在虚拟机上编写hooks的时候碰到了要给奇怪的问题:

1
git/hooks/pre-commit: Syntax error: "(" unexpected (expecting "then")

但是脚本本身确是可以执行的,后来查到应该把开头的代码编写为:

1
#!/bin/bash

为什么呢?ll /bin目录可以看到:

1
2
3
kevin@localhost:~$ ll /bin/sh /bin/bash
-rwxr-xr-x 1 root root 1113504 Apr 5 2018 /bin/bash*
lrwxrwxrwx 1 root root 4 Feb 14 13:39 /bin/sh -> dash*

Debain/Ubuntu 把sh命令指向了dash!!

dash是什么?

GNU/Linux 操作系统中的 /bin/sh 本是 bash (Bourne-Again Shell) 的符号链接,但鉴于 bash 过于复杂,有人把 bash 从 NetBSD 移植到 Linux 并更名为 dash (Debian Almquist Shell),并建议将 /bin/sh 指向它,以获得更快的脚本执行速度。Dash Shell 比 Bash Shell 小的多,符合POSIX标准。

这锅应该让Ubuntu背!