我有一个为我的办公室管理的 GIT 存储库。由于公司政策,我们不能使用外部托管提供商,例如 GitHub 等。所以,我只能利用我们的本地网络尽我所能。
每个人都管理自己的本地存储库,但我们也有一个远程存储库,用户可以推送到该存储库(并且可供 Hudson 和 Fisheye 等应用程序访问),类似于中央存储库在 Subversion 中的工作方式。每个用户都有公钥设置,因此他们也可以对托管我们的远程存储库的盒子执行无密码身份验证。
对于我们的远程存储库,我将它们配置为以“组”模式共享:
git config core.sharedRepository group
我们所有的用户也是 git 组的成员,但这并不是许多用户的主要组。看起来,当 git 在“推送”上创建或更新任何对象时,它会使用用户的主要组。相反,我需要它使用每个用户都是其成员的公共“git”组。我之前在网上看到过讨论设置粘性位的文档,但它似乎根据源而有所不同,并且没有真正解决创建公共组的问题(如果我只是使文件任意可写,我不妨把它们做成 777)。
Update:
使用马修·弗拉申的回答如下 https://stackoverflow.com/questions/5306768/file-permission-issues-with-sharing-a-git-remote-repository/5306825#5306825
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 {} + 应用到顶级目录(远程存储库)而不是每个单独的存储库,对吗?查找命令
find /opt/remote-repos -type d -exec ...
查找 /opt/remote-repos 位置下的所有目录,并对它们执行命令。命令 (chmod g+rws) 确保组可以读取和写入这些文件,并设置粘性赌注,以便在执行时始终使用指定的组。 (我不知道 {} + 部分的使用,我假设这与 find exec 选项有关)。
无论如何,只是想确认我对这个解决方案的理解是正确的。
更多参考:
-
chmod http://en.wikipedia.org/wiki/Chmod来自维基百科
-
SetGID http://en.wikipedia.org/wiki/Setgid(或 SetUID)来自维基百科
-
Git 共享存储库 http://criticallog.thornet.net/2010/01/07/sharing-your-git-repository/选项讨论