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

我有一个临时服务器上的多个开发人员需要能够拉到一个Git存储库。 git-init似乎有一个非常接近我正在寻找的标志: – --shared ,除了我想多个人拉到该存储库,以及。 git-clone--shared标志完全不同。

什么是最简单的方法来改变现有的知识库的权限

权限是一个有害生物。

基本上,你需要确保所有的开发人员都可以写入所有的git仓库。

跳到新浪解决scheme,以获得批准开发人员编写function的上级方法。

标准解决scheme

如果你把所有的开发者都放在一个特别创build的组里,你原则上可以这样做:

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

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

这个问题是军团的; 如果您的发行版假设为022umask (例如默认情况下有一个包含所有人的普通users组),则可能会在其他位置引发安全问题。 迟早,有些东西会搞砸你精心devise的权限scheme,使得repo不再起作用,直到你获得root权限并修复它(即重新运行上面的命令)。

新的解决scheme

一个优秀的解决scheme虽然不太好理解,并且需要更多的操作系统/工具支持,但是使用POSIX扩展属性。 我最近才刚刚进入这个领域,所以我在这方面的知识还不够热。 但基本上,一个扩展的ACL可以在不止3个默认插槽(user / group / other)上设置权限。

所以再次创build你的组,然后运行:

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

这为组build立了扩展ACL,以便组成员可以读/写/访问已经存在的文件(第一行); 然后,还要告诉所有现有的目录,新文件应该应用相同的ACL(第二行)。

希望能让你走上正轨。

如果你创build了仓库(或者从现有仓库克隆一个新的裸仓库)

 $ git init --shared=group 

要么

 $ git init --shared=0NNN 

Git应该处理超出默认的umask所提供的权限。 最后,我的Git版本(1.6.3)也是如此。 当然这假定你的用户在同一个组里。

如果我需要pipe理不同程度的读/写的多个用户组,我会用gitosis。 我也听说gitolite( http://github.com/sitaramc/gitolite ),一个gitosis叉,是suppossed提供分支级别的权限,不能说我已经每个人都使用它,虽然。

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

为了确保权限问题不会让他们头脑丑陋,请确保在你的git共享库的configuration文件中设置以下内容:

 [core] sharedRepository = true 

这将确保您的系统的“umask”设置得到尊重。

Git用户手册介绍了如何以多种方式共享一个存储库 。

  • 通过Git守护进程导出。
  • 通过HTTP导出。
  • CVS / SVN风格,开发人员推/拉的单个共享存储库 。

更复杂的是,尽pipe共享存储库的全function方法是:

  • Gitosis的
  • GitHub (或GitHub 防火墙安装 )

我们使用GitHub为6个开发人员组成的团队。

也看看gitolite托pipe你的git仓库。 显然Gitosis没有被开发出来。

一种修复共享库中的权限的方法,所以用户在推送的时候不会有权限问题,就是创build一个更新后的钩子脚本。 这应该在任何git版本中工作。

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

/myrepo.git/hooks/post-update

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

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

编辑:

另外检查这篇文章的8种方式来分享你的git存储库 。

从各种其他回答和build议新回购的意见中汇总好的build议:

如果你在/srv/git myrepo /srv/gitmygroup设置了一个全新的repo myrepo ,这就是你想要的:

 mkdir /srv/git/myrepo.git chgrp mygroup /srv/git/myrepo.git git init --bare --shared /srv/git/myrepo.git 
  1. 第一行创build回购目录
  2. 第二行将其组设置为mygroup
  3. 第三行用以下configuration初始化裸回购:
    1. core.bare = true :使其成为一个裸回购
    2. core.sharedrepository = 1 (与core.sharedrepository = group相同):repo目录和其后创build的所有目录都将由git进行pipe理,以允许mygroup读,写和执行权限(还设置了sgid位 -以便与mygroup不是其主要用户的用户一起工作)
    3. receive.denyNonFastforwards = 1 :否认非快进推动回购

如果您想调整用户,组或其他用户的权限,请使用--shared=0NNN ,其中NNN是文件的标准用户,组和其他位( 目录上的execute和sgid位将被pipe理适当地由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命令(以确保回购利用正确的所有者的所有的初始文件和子目录)。

@stevek_mcc答案是我寻找这个问题时,我正在寻找

 git clone --config core.sharedRepository=true