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

共享GIT远程存储库时的文件权限问题,git,repository,Git,Repository,我有一个为办公室管理的GIT存储库。由于公司政策,我们不能使用外部托管提供商,如GitHub等。所以,我只能对我们的本地网络尽我所能 每个人都管理自己的本地存储库,但我们也有一个远程存储库,我们的用户可以将其推送到(并且可以访问Hudson和Fisheye等应用程序),这与subversion中的中央回购类似。每个用户都有公钥设置,因此他们也可以对托管远程存储库的盒子执行无密码身份验证 对于我们的远程存储库,我已将它们配置为在“组”模式下共享: 我们所有的用户都是git组的成员,但这不是许多用户

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

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

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

我们所有的用户都是git组的成员,但这不是许多用户的主要组。似乎当git在“推送”上创建或更新任何对象时,它会使用用户的主组。相反,我需要它使用公共的“git”组,即每个用户都是一个成员。我以前在web上看到过讨论设置粘性位的文档,但它似乎因来源不同而有所不同,并且没有真正解决创建公共组的问题(如果我只是使文件可以任意写入,我还不如将其设置为777)


更新:

使用Matthew Flaschen的

我能够创建一个每个人都可以一起推拉的存储库。我还将研究gitolite,但我的需求是非常基本的,我们的环境允许自动配置用户和密钥,因此它的用途不是作为密钥。但是,我想确保我处理的是正确的

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

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

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

更多参考资料:

  • 来自维基百科
  • (或SetUID)来自维基百科
  • 选项讨论
git现在有了一个选项来实现这一目的

我建议:

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回购的方式。但是,我同意你应该考虑一个实际的Git服务器进程。

< P>最简单的方法是使用GITLITE。我在这方面取得了巨大成功。

用户不应使用任何具有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
+
将所有更改推送到repo

它将为repo中的所有代码文件重新创建权限。

设置基于HTTP的解决方案可能更容易,并且只让服务器进程写入中央存储库文件。您应该尝试!虽然gitolite看起来不错,但我已经在我的环境中实现了很多功能(ssh访问、密钥等)。唯一真正缺少的是正确的组权限。经过一系列的游戏和战斗,我能够让它工作(使用chmod g+rws位。我有一个后续问题,我将在原始问题中包括。@J Jones,是的,看起来你可以在顶级目录中完成。我假设它们都是裸存储库。-1推荐设置。
chmod g+s
仍然是必需的。谢谢,@Basilevs补充道。
chgrp git -R repo.git 
find repo.git -type d -exec chmod g+rws {} +
find /path/to/repo_folder -type d -exec chmod 755 {} \;
find /path/to/repo_folder -type f -exec chmod 644 {} \;