共享GIT远程存储库时的文件权限问题

时间:2011-03-15 02:12:56

标签: git repository

我有一个GIT存储库,我为我的办公室管理。由于公司政策,我们不能使用GitHub等外部托管服务提供商。所以,我只能通过本地网络尽我所能。

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

对于我们的远程存储库,我将它们配置为以“组”模式共享:

git config core.sharedRepository group

我们所有的用户也都是git组的成员,但这不是许多用户的主要组。当git在“push”上创建或更新任何对象时,它会使用用户的主要组。相反,我需要它使用每个用户都是成员的常见“git”组。我之前在网上看到过关于设置粘滞位的文档,但它似乎因源而异,并没有真正解决创建公共组的问题(如果我只是将文件随意写入,我不妨让他们777)。


更新

使用Matthew Flaschen的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)而不是每个单独的repo,对吗? find命令

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

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

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

更多参考资料:

3 个答案:

答案 0 :(得分:15)

git现在有一个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 {} +

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

这类似于我的工作中如何设置git repo。但是,我同意您应该考虑实际的git服务器进程。

答案 1 :(得分:3)

用户不应使用任何带有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进行回购所有更改 它将为repo中的所有代码文件重新创建权限。

答案 2 :(得分:0)

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