2011-03-15 155 views
12

我有一个GIT仓库,可以为我的办公室管理。由于公司政策,我们不能使用外部托管服务提供商,如GitHub等。所以,我仍然要尽我所能与我们的本地网络。共享GIT远程仓库的文件权限问题

每个人都管理自己的本地存储库,但我们也有一个远程存储库,我们的用户将其推送到(并且可以被Hudson和Fisheye等应用程序访问),类似于一个中央repo在颠覆中的工作方式。每个用户都有公钥设置,因此他们可以对托管我们远程存储库的盒子执行无密码验证。

对于我们的远程仓库,我让他们配置为:在“组”模式共享:

git config core.sharedRepository group 

我们所有的用户群也混帐组的成员,但不是主组的许多的用户。看起来,当git在“push”上创建或更新任何对象时,它使用用户的主要组。相反,我需要它使用每个用户都是成员的通用“混帐”组。我曾经在网上看过有关设置粘性位的文档,但它似乎根据源代码有所不同,并没有真正解决创建公共组的问题(如果我只是使文件可任意写入,我不妨让他们777)。


更新:

使用马修•富兰琛的answer below

chgrp -R git repo.git 
find repo.git -type d -exec chmod g+rws {} + 

我能够创建一个仓库,每个人都可以推,从拉在一起。我也会研究gitolite,但我的需求是非常基础的,我们的环境允许用户和密钥自动配置,所以它的使用不是关键。但是,我想确保我正确处理这个问题。

我的存储库结构包括一个顶级目录(remote-repos)和我的每个存储库(app-1.git,app-2.git,library-1.git等)的子目录。我应该能够将chmod g + rws {} +应用到顶层目录(remote-repos)而不是每个单独的回购库,对吗?查找命令

find /opt/remote-repos -type d -exec ... 

查找/ opt/remote-repos位置下的所有目录,并对它们执行命令。命令(chmod g + rws)确保组可以读取和写入这些文件,并设置粘性赌注,以便在执行时始终使用指定的组。 (我不知道使用{} +部分,我假设它与find exec选项有关)。

无论如何,只是想确认我对这个解决方案的理解是正确的。

更多的参考资料:

+0

设置基于HTTP的解决方案可能更容易,并且只有服务器进程写入中央资源库文件。 – Thilo 2011-03-15 02:17:58

+3

你应该尝试[gitolite](https://github.com/sitaramc/gitolite)! – Simon 2011-03-15 02:19:04

+0

虽然gitolite看起来不错,但我已经有很多功能(SSH访问,密钥等)被烘焙到我的环境中。唯一真正缺少的是适当的组权限。 – 2011-03-15 15:29:27

回答

15

混帐现在有整整一个core.sharedRepository选项这一点姿势。

我建议:

git config core.sharedRepository group 

然后,设置初始组的所有权,这样做:

sudo chgrp -R somegroup . 
sudo find -type d -exec chmod g+s {} + 
sudo chmod -R g+rw .git/objects/ 

在回购的根源。

对于一个新的回购,你可以这样做:

git init --shared=group 

只有上述不工作:

chgrp git -R repo.git 
find repo.git -type d -exec chmod g+rws {} + 

s是setgid标记。在目录上,这意味着在该目录下创建的文件和目录具有相同的组(本例中为git)。新创建的子目录也继承setgid。

这与git repo在我工作中的设置类似。不过,我同意你应该考虑一个实际的git服务器进程。

+0

经过一番玩耍和战斗之后,我能够得到这个工作(使用chmod g + rws位。我有一个后续步骤,我将包含在原始问题中) – 2011-03-15 14:30:36

+0

@J琼斯,是的,它看起来像你可以在顶层目录中完成它,我假设它们都是裸存储库。 – 2011-03-15 18:57:04

+1

-1推荐设置[对于从其他用户推送不够用](http://stackoverflow.com/questions/14196799/sharedrepository-wrong-group)。'chmod g + s'仍然是必需的。 – Basilevs 2014-05-15 15:36:00

0

最简单的方法是使用Gitolite。我已经取得了巨大的成功。

5

用户不应该使用任何具有sudo权限的git命令。

如果它不无sudo权限的工作,确保与755和文件检查所有文件夹的权限与644

使用下面的命令,预期可以重置权限。

find /path/to/repo_folder -type d -exec chmod 755 {} \; 
find /path/to/repo_folder -type f -exec chmod 644 {} \; 

上面的命令可能需要使用sudo权限。

这个活动后,您应该commit + push所有更改,回购 它将重新创建在回购所有的代码文件的权限。