我有一个临时服务器上的多个开发人员需要能够拉到一个Git存储库。 git-init
似乎有一个非常接近我正在寻找的标志: – --shared
,除了我想多个人拉到该存储库,以及。 git-clone
的--shared
标志完全不同。
什么是最简单的方法来改变现有的知识库的权限?
权限是一个有害生物。
基本上,你需要确保所有的开发人员都可以写入所有的git仓库。
跳到新浪解决scheme,以获得批准开发人员编写function的上级方法。
如果你把所有的开发者都放在一个特别创build的组里,你原则上可以这样做:
chgrp -R <whatever group> gitrepo chmod -R g+swX gitrepo
然后将用户的umask
更改为002
,以便使用组可写权限创build新文件。
这个问题是军团的; 如果您的发行版假设为022
的umask
(例如默认情况下有一个包含所有人的普通users
组),则可能会在其他位置引发安全问题。 迟早,有些东西会搞砸你精心devise的权限scheme,使得repo不再起作用,直到你获得root
权限并修复它(即重新运行上面的命令)。
一个优秀的解决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用户手册介绍了如何以多种方式共享一个存储库 。
更复杂的是,尽pipe共享存储库的全function方法是:
我们使用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/git
为mygroup
设置了一个全新的repo myrepo
,这就是你想要的:
mkdir /srv/git/myrepo.git chgrp mygroup /srv/git/myrepo.git git init --bare --shared /srv/git/myrepo.git
mygroup
core.bare = true
:使其成为一个裸回购 core.sharedrepository = 1
(与core.sharedrepository = group
相同):repo目录和其后创build的所有目录都将由git进行pipe理,以允许mygroup
读,写和执行权限(还设置了sgid位 -以便与mygroup
不是其主要用户的用户一起工作) 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