Linux 阻止其他git作者

Linux 阻止其他git作者,linux,git,Linux,Git,我已经设置了自己的私有git服务器,并且有一个由5名成员组成的团队。我已经设置了他们的用户帐户,但是我如何防止由随机的奇怪帐户提交到远程。因为我的一些团队也使用github,不希望他们的用户名出现在日志中,而是希望他们的用户名被我分配给他们。为了防止人们使用“随机怪异帐户”进行提交,您可以设置一个git预接收钩子,根据有效名称列表验证传入提交时的提交人/作者姓名。但这并没有提供身份验证组件 为了防止模拟,您可以简单地要求所有通信都是gpg签名的(git commit-S…),并让您pre-rec

我已经设置了自己的私有git服务器,并且有一个由5名成员组成的团队。我已经设置了他们的用户帐户,但是我如何防止由随机的奇怪帐户提交到远程。因为我的一些团队也使用github,不希望他们的用户名出现在日志中,而是希望他们的用户名被我分配给他们。

为了防止人们使用“随机怪异帐户”进行提交,您可以设置一个git
预接收
钩子,根据有效名称列表验证传入提交时的提交人/作者姓名。但这并没有提供身份验证组件

为了防止模拟,您可以简单地要求所有通信都是gpg签名的(
git commit-S…
),并让您
pre-receive
hook根据服务器上的gpg密钥环验证签名

根据人们连接到远程服务器的方式,如果您有访问权限,还可以显式地将提交者/作者名称与用于连接的用户名进行匹配

更新1

如果您的提交者通过ssh推送到您的服务器,那么上面的第三个选项可能是最简单的。在
.ssh/authorized_keys
文件中,为每个标识用户的密钥设置一个环境变量:

environment="SSH_USER=lars" ssh-rsa ...
然后在您的
pre-receive
hook中,您可以使用该环境变量根据某个表查找有效的提交者姓名/电子邮件。您可以在
githooks(5)
手册页中阅读关于
pre-receive
钩子的内容,它们在stdin上接收的格式为:

<oldrev> <newrev> <refname>
然后在预接收挂钩中:

#!/bin/sh

while read oldrev newrev refname; do
  cn=$(git show -s --format='format:%cn' $newrev)
  ce=$(git show -s --format='format:%ce' $newrev)

  [ "$cn" = "$ALLOWED_NAME" ] || {
    echo "*** Inalid committer name"
    exit 1
  }

  [ "$ce" = "$ALLOWED_EMAIL" ] || {
    echo "*** Inalid committer email"
    exit 1
  }

done
我想你得到了你想要的

更新3

您可能可以使用http实现类似的功能 身份验证,因为在
预接收
脚本中 可以访问
REMOTE\u USER
环境变量,该变量包含 经过身份验证的远程用户的名称。你可能需要 进行某种形式的表格查找,以获取已批准名称的值和
电子邮件地址。

相关:不一样。。。我基本上想要某种身份验证方法。。因此,我的团队不能像其他团队成员那样简单地通过git--config.name=“Test”@marairsossouw进行承诺。在这种情况下,您必须使用gerrit或gitlab或其他类似工具。好的。是的,我为每个提交者设置了一个linux帐户,如何通过他们的登录验证gpg签名?预接收是什么样子的?由于我有相当多的回购协议,我会为每一个回购协议都这样做吗?我已经更新了一些答案。如果您决定使用
gpg
路径,可能会涉及
grep
输出类似于
git show-s--format=format:“”--show signature
的内容,以获得
良好的签名
。我再次更新了它。我想我更喜欢这个解决方案。至少实现起来比较简单。好吧,但是现在。。如果我的团队只使用普通密码,而不是ssl密钥身份验证,该怎么办。你能做类似的事情吗?或者更重要的是,您能告诉我如何设置ssl类型身份验证吗?不是
ssl
,而是
SSH
。有很多关于使用ssh设置基于密钥的身份验证的指南。对于基于密码的身份验证,您不能做同样的事情,因为在这种情况下,没有机制让服务器设置每个用户的环境变量。
environment="ALLOWED_NAME=Bob Jones",environment="ALLOWED_EMAIL=bob@example.com" ssh-rsa ...
#!/bin/sh

while read oldrev newrev refname; do
  cn=$(git show -s --format='format:%cn' $newrev)
  ce=$(git show -s --format='format:%ce' $newrev)

  [ "$cn" = "$ALLOWED_NAME" ] || {
    echo "*** Inalid committer name"
    exit 1
  }

  [ "$ce" = "$ALLOWED_EMAIL" ] || {
    echo "*** Inalid committer email"
    exit 1
  }

done