我有一个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选项有关。)
无论如何,只是想确认我对这个解决方案的理解是正确的。
更多参考资料:
答案 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。我已经取得了很大的成功。