it-swarm.cn

如何与一台机器上的多个用户共享Git存储库?

我在登台服务器上有一个Git存储库,需要多个开发人员才能将其存储到。 git-init 似乎有一个非常接近我要查找的标志:--shared,不过我也希望多人同时访问该存储库。 git-clone--shared标志的作用完全不同。

更改现有存储库权限的最简单方法是什么?

217
Andrey Fedorov

许可是一种害虫。

基本上,您需要确保所有这些开发人员都可以写入git repo中的所有内容。

跳至新波解决方案以获取授予一组开发人员写功能的高级方法。

标准解决方案

如果将所有开发人员放在一个专门创建的小组中,原则上可以做到:

chgrp -R <whatever group> gitrepo
chmod -R g+swX gitrepo

然后将用户的umask更改为002,以便使用组可写权限创建新文件。

问题在于军团;如果您使用的发行版假设umask022(例如,具有一个默认情况下包括每个人的users组),这可能会在其他地方引发安全问题。迟早会有一些事情弄糟您精心设计的权限方案,使存储库失效,直到您获得root访问权限并对其进行修复(即,重新运行以上命令)。

新波解决方案

上乘的解决方案(虽然尚不为人所理解,并且需要更多的OS /工具支持)是使用POSIX扩展属性。我只是最近才来这方面的,所以我对这里的了解并不那么热。但基本上,扩展的ACL不仅可以在3个默认插槽(用户/组/其他)上设置权限。

因此,再次创建您的组,然后运行:

setfacl -R -m g:<whatever group>:rwX gitrepo
find gitrepo -type d | xargs setfacl -R -m d:g:<whatever group>:rwX

这将为组设置扩展的ACL,以便组成员可以读取/写入/访问已经存在的任何文件(第一行);然后,还告诉所有现有目录新文件应应用相同的ACL(第二行)。

希望这能帮助您。

193
womble

如果您使用以下命令创建了存储库(或从现有存储库中克隆了一个新的裸存储库)

$ git init --shared=group 

要么

$ git init --shared=0NNN

Git应该能够处理超出默认umask所提供权限之外的权限。最后,在我的Git版本(1.6.3)中,这是正确的。当然,这假设您的用户在同一组中。

但是,如果我需要以不同程度的读/写来管理多个组中的用户,那么我会使用gitosis。我也听说过有人提到过gitolite( http://github.com/sitaramc/gitolite ),它是一个提供分支级别权限的gitosis分支,不能说我已经使用过它了个人而言。

122
user35117

这还没有说,所以我想快速添加它。

为了确保权限问题不会变得丑陋,请确保在git共享存储库的配置文件中设置以下内容:

[core]
    sharedRepository = true

这将确保遵守系统的“ umask”设置。

55
Niels Joubert

Git用户手册 描述了如何通过多种方式 共享存储库

尽管功能齐全,但是共享存储库的方法更为复杂:

我们将GitHub用于由6个开发人员组成的团队。

22
jtimberman

另请参阅 gitolite 以托管您的git存储库。胃肌萎缩症显然不再被发展。

9
mt3

修复共享存储库中的权限(使用户在推送时不会出现权限问题)的一种方法是创建一个更新后的钩子脚本即可。这应该可以在任何git版本中使用。

假设您在/myrepo.git中有一个共享存储库。该存储库中的所有文件都属于mysharedgroup。推送到该存储库的所有用户也应属于mysharedgroup。现在创建以下文件(将mysharedgroup更改为您的首选项):

/ myrepo.git/hooks/post-update

#!/bin/sh
chmod -R g+w . 2>/dev/null
chgrp -R mysharedgroup . 2>/dev/null
4
bkmks

要汇总其他各种关于建立新仓库的答案和评论中的一些好建议,请执行以下操作:

如果您要为myrepo组在/srv/git中设置一个全新的仓库mygroup,则需要执行以下操作:

mkdir /srv/git/myrepo.git
chgrp mygroup /srv/git/myrepo.git
git init --bare --shared /srv/git/myrepo.git
  1. 第一行创建仓库目录
  2. 第二行将其组设置为mygroup
  3. 第三行使用以下配置初始化裸仓库:
    1. core.bare = true:使其成为一个简单的仓库
    2. core.sharedrepository = 1(与core.sharedrepository = group相同):repo目录和以后在其中创建的所有目录将由git管理,以允许mygroup读取,写入和执行权限(带sgid位)设置-以便与mygroup不是其主要用户的用户一起使用)
    3. receive.denyNonFastforwards = 1:拒绝非快速推送到存储库

如果要微调用户,组或其他用户的权限,请使用--shared=0NNN,其中NNNfiles的标准用户,组和其他位。 =(目录上的execute和sgid位将由git适当地管理)。例如,这允许对用户的读写访问,以及对组的只读访问(而对其他用户无访问):

git init --bare --shared=0640 /srv/git/myrepo.git

这样就可以对用户和组进行读写访问(而不能访问其他用户):

git init --bare --shared=0660 /srv/git/myrepo.git

这允许对用户和组的读写访问,以及对其他用户的只读访问:

git init --bare --shared=0664 /srv/git/myrepo.git

请注意,如果您不想允许对该组的写访问,请确保首先使用chown设置存储库的所有者,然后以该用户身份运行git init命令(确保使用所有初始文件和子目录的正确所有者初始化存储库。

3
Justin Ludwig

您可以使用git-daemon共享存储库。阅读 git-daemon 的文档以获取更多信息。

编辑:

还要检查这篇文章 共享git存储库的8种方法

2
Vihang D

对于现有的存储库,这样做对我来说确实有效。这需要从以下几个答案和评论中获取建议:

在服务器的存储库父目录中:

chgrp -R <whatever group> gitrepo
chmod -R g+wX gitrepo
cd gitrepo
find . -type d -exec chmod g+s {} +
git config core.sharedRepository group
1
Luis de Arquer

@stevek_mcc答案是我在Google搜索此问题时一直在寻找的答案

git clone --config core.sharedRepository=true
0
ragerdl