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

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

评论

我正在使用“ Github Windows版”并在两个Github帐户之间切换:stackoverflow.com/questions/18565876/…

#1 楼

权限是有害生物。

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

跳至The New-Wave解决方案为授予一组开发人员写功能的高级方法。

标准解决方案

如果将所有开发人员都放在一个专门创建的组中,原则上可以,只需执行以下操作:

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


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

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

New-Wave解决方案

一个高级解决方案是使用POSIX扩展属性,尽管它尚不为人所理解,并且需要更多的OS /工具支持。我只是最近才来这方面的,所以我对这里的了解并不那么热。但基本上,扩展的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(第二行)。

希望您可以顺利进行。

评论


git init有一个名为--shared的参数,该参数为组工作设置core.sharedRepository变量。您还可以在现有存储库上设置变量。这消除了手动设置umask的需要,因为git会在处理文件之前将其设置为合理的值。

–ptman
2010-2-17在9:04

POSIX扩展属性的+1-对我来说是新闻!

–RobM
11年2月2日在15:08

当我执行chmod -R g + swX时,它使Git感到非常不快,并决定它不再是git存储库(“ repo似乎不是git存储库”)。我不得不chmod g-s所有文件。要仅在目录上设置setgid位,请尝试查找/ path / to / repo -type d -print0 | xargs -0 chmod g + s。仍然使用chgrp -R thegroup / path / to / repo。

–rescdsk
2012年4月25日19:01



chmod -R g + swX gitrepo会将setguid位应用于文件,这存在安全风险。相反,您可以使用find。 -type d -exec chmod g + s {} +仅将其应用于目录。

–伊恩·邓恩
2012年9月19日在19:47

ACL(setfacl)没有设置setgid来强制执行在目录中创建的新文件和子目录以继承其组ID。因此,必须通过chmod分别设置setgid。但是,Git的--shared选项(git-scm.com/docs/git-init)允许您设置并覆盖用户的umask。

–追逐T。
2014年4月9日15:17



#2 楼

(如果您使用

$ git init --shared=group 




$ git init --shared=0NNN


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

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

评论


这绝对是正确的答案。

– ELLIOTTCABLE
2011-12-05 7:45

我遇到了这个问题,这是迄今为止最好的答案。唯一的问题是--shared参数采用八进制而不是十六进制。我已经在Git 1.7.8的源代码中确认了这一点,第二个示例应该是git init --shared = 0NNN。

– qpingu
2012年1月25日在5:42



什么是NNN-权限掩码或组号或其他内容?

–克雷格·麦昆(Craig McQueen)
2014年7月8日在2:48

顺便说一句,上面的“组”是一个关键字,而不是您的组名的占位符。您可以使用chgrp命令分配组。对于新的存储库,它是git init --bare --shared = group myproj,其中myproj是您的存储库名称,然后是chgrp -R mygroup myproj,其中mygroup是您的组名称。

–拉布拉多
2014年7月17日下午13:05

请注意,如果您的用户在其默认组与应有的默认组不同时进行提交,则可能会搞砸。要解决此问题,您需要每个用户将自己在存储库中拥有的每个文件chgrp到正确的组中。除非您弄清楚如何在提交和推送之前让所有人在正确的组下/将新文件创建/切换到正确的组,否则这种情况将再次发生。

–ragerdl
16年4月29日在17:24

#3 楼

尚未有人说过,因此我想快速添加它。 />
[core]
    sharedRepository = true


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

评论


根据git-config(1)(kernel.org/pub/software/scm/git/docs/git-config.html)core.sharedRepository,您需要将其设置为“ umask”或“ false”以具有git的尊重用户的umask。

–David Schmitt
11年8月12日在10:05

这个和user35117的答案是正确的。注意,“ true”与“ group”相同,可以使用命令git config core.sharedRepository true进行设置。

– ColinM
2011年12月22日,下午3:43

当文件被推送到远程位置时,它仍然会更改文件的所有权吗?

–Duc Tran
16年7月28日在22:42

如果要在克隆时而不是在事后进行设置,则git init --shared等效于git clone --config core.sharedRepository = true。 git奇怪,在类似的命令中使用--shared具有不同的含义。

–stevek_mcc
16-09-30在11:02

#4 楼

《 Git用户手册》介绍了如何通过几种方式共享存储库。


通过Git守护程序导出。
通过HTTP导出。CVS/ SVN样式开发人员推/拉的单个共享存储库。

尽管功能齐全的共享存储库的方式更为复杂,但仍是:
> GitHub(或GitHub防火墙安装)

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

评论


我喜欢胃病。这是一种基于公共密钥控制访问的非常有效的方法。

–迈克·马祖(Mike Mazur)
09年6月17日在7:42

这些解决方案中的任何一个如何解决“我希望多个人拉到该存储库”的问题?

–womble♦
09年6月17日在7:59

看一下gitosis。那解决了你的问题。

– pilif
09年6月17日在8:43

当您共享存储库时,人们将能够从中提取信息。他们可能需要克隆它,或添加一个远程分支。我链接的文档将非常清楚地引导您解决问题。我使用了所有描述的方法来帮助开发人员与Git协作源代码。据我所知ServerFault不是手持的。

– jtimberman
09年6月17日在17:34

我必须同意使用Gitosis。通过使用由多个SSH密钥验证的单个帐户,可以解决权限问题。也可以通过git commits对其进行完全管理。

– Jeremy Bouse
09年6月18日在18:42

#5 楼

另请查看用于托管您的git存储库的gitolite。胃肌萎缩症显然不再被发展。

#6 楼

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


评论


当用户具有不同的默认组时的正确答案

–帕特
2011-11-23 23:42

在目录上设置setgid位将导致用户创建的文件继承与目录相同的组所有权(如果用户属于该组)。即使它不是用户的默认组。然后,不需要此钩子。这就是@womble的答案(以及我对此的评论)。

–rescdsk
2012年4月25日在22:21



在我的centos7机器上,尝试了此页上列出的每个解决方案之后,上述@bkmks解决方案的变体是唯一有效的选项(设置合并后和检出后挂钩而不是如上所述的更新后)。

–迈克·戈丹(Mike Godin)
16年6月15日在15:58

我认为推广将STDER上的错误消息或警告传递到/ dev / null的解决方案是不好的建议。请先让用户看到这些消息,然后再自行决定。

–丹尼尔·博默(DanielBöhmer)
18/12/6在13:42

#7 楼

要汇总来自其他各种答案和意见的关于建立新回购协议的零碎建议,请按以下步骤进行操作:

如果您要在myrepo中为/srv/git组设置一个全新的回购mygroup,则此是您想要的:

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目录和以后在其中创建的所有目录将由git管理,以允许mygroup的读,写和执行权限(也设置了sgid位-以便与不是mygroup的用户一起使用主要组)

receive.denyNonFastforwards = 1:拒绝非快速推送到存储库





如果要微调用户,组或其他用户的权限,请使用--shared=0NNN,其中q43 12079q是文件的标准用户,组和其他位(目录上的execute和sgid位将由git适当管理)。例如,这允许对用户进行读写访问,而对组具有只读访问权限(而对其他用户则无访问权限):

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


这允许读取和写入对用户和组的写访问权限(而对其他用户无访问权限):其他:

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


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

评论


比更高的投票答复更正确。

– XO01
18-10-22在3:14

#8 楼

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

编辑:

还请检查本文共享git存储库的8种方法。

#9 楼

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

从存储库父目录的服务器上:

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


#10 楼

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

git clone --config core.sharedRepository=true