Linux 如何在远程服务器上阻止推送到主分支

Linux 如何在远程服务器上阻止推送到主分支,linux,git,Linux,Git,是否有任何方法可以阻止代码直接推送到master?我尝试在.git/hooks/update中添加脚本: #!/bin/sh if [ $USER != "git-repo-admin" ]; then if [ "$1" == refs/heads/master ]; then echo "Manual pushing to this repo is restricted" exit 1 fi fi 但这不起作用——每个人都可以推。我想只允许特定用户推到主机上并阻

是否有任何方法可以阻止代码直接推送到master?我尝试在
.git/hooks/update
中添加脚本:

#!/bin/sh
if [ $USER != "git-repo-admin" ];
then
  if [ "$1" == refs/heads/master ];
  then
    echo "Manual pushing to this repo is restricted"
    exit 1
  fi
fi

但这不起作用——每个人都可以推。我想只允许特定用户推到主机上并阻止其他用户。

使用git钩子控制访问可能是一种一次性的黑客攻击,但可能会导致难以维护的git服务器配置

因此,我建议设置,这正是针对这种访问控制所做的。
它管理(这有利于推动)

您可以在“”中找到防止分支内推送的示例:


Gitolite可以依赖ssh进行身份验证,并自动化公钥注册过程

但若并没有Gitolite,您仍然可以仅使用ssh保护对Git repo的读/写访问,如的“”中所述(如中所述)

作为额外的预防措施,您可以轻松地将“git”用户限制为仅使用git附带的名为的有限shell工具执行git活动。
如果将此设置为“
git
”用户的登录shell,则“
git
”用户无法正常访问服务器的shell。要使用它,请为用户的登录shell指定
gitshell
,而不是
bash
csh
。为此,您可能需要编辑
/etc/passwd
文件


原始脚本非常完美,我只需要在远程服务器上将其从
.git/hooks/update.sample
重命名为
.git/hooks/update
,并确保其可执行

#!/bin/sh
if [ $USER != "git-repo-admin" ];
then
  if [ "$1" == refs/heads/master ];
  then
    echo "Manual pushing to this repo is restricted"
    exit 1
  fi
fi

您可以转到回购设置->分行


Git询问您要保护哪个分支

如果您的目的是在代码更改到达主存储库之前检查它们,您可能会发现gerrit很感兴趣,hook看起来不错。不过有两个问题:(1)为什么“推式”回购通常应该是“裸式”;(2) 你确定钩子是可执行的(chmod+x)吗?(如果您手动运行它会发生什么情况,例如
/.git/hooks/update refs/heads/master
)@AnthonyGeoghegan(关于服务器上的git,在编辑之前)。我在答案中加入了它以提高可见性。@AnthonyGeoghegan Gitolite使用git钩子,但通过在专用的repo中管理它们来促进它们的维护(
Gitolite admin
)。安装非常简单。由于只需要共享git存储库中的简单功能,我使用了Scott Chacon的一个修改版本,即使用git钩子控制访问,这可能是一种一次性的黑客攻击,但可能会导致难以维护的git服务器配置。这个答案值得投票,因为最好使用为提供访问控制和允许轻松更改权限而编写的软件。注意:此评论是我在按Enter键时意外提交的先前评论的合并。此问题与github无关。
#!/bin/sh
if [ $USER != "git-repo-admin" ];
then
  if [ "$1" == refs/heads/master ];
  then
    echo "Manual pushing to this repo is restricted"
    exit 1
  fi
fi