Andrey Fedorov Asked: 2009-06-17 17:04:08 +0800 CST2009-06-17 17:04:08 +0800 CST 2009-06-17 17:04:08 +0800 CST 如何在一台机器上与多个用户共享一个 Git 存储库? 772 我在登台服务器上有一个 Git 存储库,多个开发人员需要能够拉到该存储库。git-init似乎有一个非常接近我正在寻找的标志:--shared,除了我希望多个人也可以拉到该存储库。的标志做一些完全不同git-clone的事情。--shared 更改现有存储库权限的最简单方法是什么? permissions users share git 10 个回答 Voted Best Answer womble 2009-06-17T22:00:53+08:002009-06-17T22:00:53+08:00 权限是一种害虫。 基本上,您需要确保所有这些开发人员都可以写入 git 存储库中的所有内容。 跳至 New-Wave 解决方案,了解授予一组开发人员编写能力的卓越方法。 标准解决方案 如果您将所有开发人员放在一个专门创建的组中,原则上您可以这样做: chgrp -R <whatever group> gitrepo chmod -R g+swX gitrepo 然后umask将用户更改为002,以便创建具有组可写权限的新文件。 这方面的问题很多。如果您使用的发行版假定umask为022(例如有一个users默认情况下包含所有人的公共组),这可能会在其他地方引发安全问题。迟早,某些事情会破坏您精心设计的权限方案,使 repo 无法运行,直到您获得root访问权限并修复它(即重新运行上述命令)。 新浪潮解决方案 一个更好的解决方案——虽然不太为人所知,并且需要更多的操作系统/工具支持——是使用 POSIX 扩展属性。我最近才来这个地区,所以我在这里的知识并不像它可能的那么热。但基本上,扩展的 ACL 是能够在超过 3 个默认插槽(用户/组/其他)上设置权限的能力。 因此,再次创建您的组,然后运行: setfacl -R -m g:<whatever group>:rwX gitrepo find gitrepo -type d | xargs setfacl -R -m d:g:<whatever group>:rwX 这将为组设置扩展 ACL,以便组成员可以读取/写入/访问已经存在的任何文件(第一行);然后,还告诉所有现有目录新文件应该应用相同的 ACL(第二行)。 希望这能让你上路。 user35117 2010-02-17T21:40:48+08:002010-02-17T21:40:48+08:00 如果您使用 $ git init --shared=group 或者 $ git init --shared=0NNN Git 应该处理超出默认 umask 提供的权限。最后,这在我的 Git 版本(1.6.3)上是正确的。当然,这假设您的用户在同一个组中。 但是,如果我需要管理具有不同读/写程度的多个组中的用户,我会选择 gitosis。我还听说过 gitolite ( http://github.com/sitaramc/gitolite ),这是一个 gitosis 分支,应该提供分支级别的权限,但不能说我每个人都亲自使用过它。 Niels Joubert 2011-03-09T21:52:09+08:002011-03-09T21:52:09+08:00 这个还没有说,所以我想快速添加它。 为确保权限问题不会出现丑陋的问题,请确保在您的 git 共享存储库的配置文件中设置以下内容: [core] sharedRepository = true 这将确保您的系统的“umask”设置得到尊重。 jtimberman 2009-06-17T23:35:50+08:002009-06-17T23:35:50+08:00 Git 用户手册描述了如何以多种方式共享存储库。 通过Git Daemon导出。 通过HTTP导出。 CVS/SVN 风格,开发人员推/拉的单一共享存储库。 共享存储库的更复杂但功能齐全的方法是: 甲状腺肿大 GitHub(或 GitHub防火墙安装) 我们为 6 名开发人员组成的团队使用 GitHub。 mt3 2011-01-20T00:55:31+08:002011-01-20T00:55:31+08:00 还可以查看gitolite来托管您的 git 存储库。Gitosis 显然不再被开发。 Justin Ludwig 2015-05-26T17:24:06+08:002015-05-26T17:24:06+08:00 要从有关设置新存储库的各种其他答案和评论中汇总一些好的建议: myrepo如果您正在/srv/git为 group设置一个全新的 repo mygroup,这就是您想要的: mkdir /srv/git/myrepo.git chgrp mygroup /srv/git/myrepo.git git init --bare --shared /srv/git/myrepo.git 第一行创建 repo 目录 第二行将其组设置为mygroup 第三行使用以下配置初始化一个裸仓库: core.bare = true: 让它成为一个裸仓库 core.sharedrepository = 1(同core.sharedrepository = group):repo 目录和以后在其中创建的所有目录将由 git 管理,以允许mygroup读取、写入和执行权限(也设置了 sgid 位 - 以便与mygroup不是他们的用户一起工作初级组) receive.denyNonFastforwards = 1: 拒绝非快进推送到 repo 如果您想微调用户、组或其他用户的权限,请使用--shared=0NNN,文件NNN的标准用户、组和其他位在哪里(目录上的执行和 sgid 位将由 git 适当管理)。例如,这允许对用户进行读写访问,以及对组的只读访问(并且不能访问其他): git init --bare --shared=0640 /srv/git/myrepo.git 这允许对用户和组进行读写访问(并且不能访问其他): git init --bare --shared=0660 /srv/git/myrepo.git 这允许对用户和组进行读写访问,以及对其他用户和组的只读访问: git init --bare --shared=0664 /srv/git/myrepo.git 请注意,如果您不允许对该组进行写访问,请确保首先使用chown设置存储库的所有者,然后git init以该用户身份运行命令(以确保使用正确的所有者初始化存储库所有初始文件和子目录)。 bkmks 2011-09-28T06:35:55+08:002011-09-28T06:35:55+08:00 在共享存储库中修复权限的一种方法是创建一个更新后的挂钩脚本,以便用户在推送时不会遇到权限问题。这应该适用于任何 git 版本。 假设您在 /myrepo.git 中有一个共享存储库。该存储库中的所有文件都属于mysharedgroup。所有推送到该存储库的用户也应该属于mysharedgroup。现在创建以下文件(将mysharedgroup更改为您的首选项): /myrepo.git/hooks/post-update #!/bin/sh chmod -R g+w . 2>/dev/null chgrp -R mysharedgroup . 2>/dev/null Vihang D 2009-06-17T18:58:56+08:002009-06-17T18:58:56+08:00 您可以使用 git-daemon 来共享存储库。阅读git-daemon的文档以获取更多信息。 编辑: 另请查看这篇文章8 种共享 git 存储库的方法。 Luis de Arquer 2017-12-14T04:44:41+08:002017-12-14T04:44:41+08:00 对于现有的存储库,这样做对我有用。这需要从之前的几个答案和评论中获得建议: 从您的存储库父目录,在服务器上: chgrp -R <whatever group> gitrepo chmod -R g+wX gitrepo cd gitrepo find . -type d -exec chmod g+s {} + git config core.sharedRepository group interestedparty333 2017-03-30T11:02:20+08:002017-03-30T11:02:20+08:00 @stevek_mcc 答案是我在谷歌上搜索这个问题时正在寻找的答案 git clone --config core.sharedRepository=true
权限是一种害虫。
基本上,您需要确保所有这些开发人员都可以写入 git 存储库中的所有内容。
跳至 New-Wave 解决方案,了解授予一组开发人员编写能力的卓越方法。
标准解决方案
如果您将所有开发人员放在一个专门创建的组中,原则上您可以这样做:
然后
umask
将用户更改为002
,以便创建具有组可写权限的新文件。这方面的问题很多。如果您使用的发行版假定
umask
为022
(例如有一个users
默认情况下包含所有人的公共组),这可能会在其他地方引发安全问题。迟早,某些事情会破坏您精心设计的权限方案,使 repo 无法运行,直到您获得root
访问权限并修复它(即重新运行上述命令)。新浪潮解决方案
一个更好的解决方案——虽然不太为人所知,并且需要更多的操作系统/工具支持——是使用 POSIX 扩展属性。我最近才来这个地区,所以我在这里的知识并不像它可能的那么热。但基本上,扩展的 ACL 是能够在超过 3 个默认插槽(用户/组/其他)上设置权限的能力。
因此,再次创建您的组,然后运行:
这将为组设置扩展 ACL,以便组成员可以读取/写入/访问已经存在的任何文件(第一行);然后,还告诉所有现有目录新文件应该应用相同的 ACL(第二行)。
希望这能让你上路。
如果您使用
或者
Git 应该处理超出默认 umask 提供的权限。最后,这在我的 Git 版本(1.6.3)上是正确的。当然,这假设您的用户在同一个组中。
但是,如果我需要管理具有不同读/写程度的多个组中的用户,我会选择 gitosis。我还听说过 gitolite ( http://github.com/sitaramc/gitolite ),这是一个 gitosis 分支,应该提供分支级别的权限,但不能说我每个人都亲自使用过它。
这个还没有说,所以我想快速添加它。
为确保权限问题不会出现丑陋的问题,请确保在您的 git 共享存储库的配置文件中设置以下内容:
这将确保您的系统的“umask”设置得到尊重。
Git 用户手册描述了如何以多种方式共享存储库。
共享存储库的更复杂但功能齐全的方法是:
我们为 6 名开发人员组成的团队使用 GitHub。
还可以查看gitolite来托管您的 git 存储库。Gitosis 显然不再被开发。
要从有关设置新存储库的各种其他答案和评论中汇总一些好的建议:
myrepo
如果您正在/srv/git
为 group设置一个全新的 repomygroup
,这就是您想要的:mygroup
core.bare = true
: 让它成为一个裸仓库core.sharedrepository = 1
(同core.sharedrepository = group
):repo 目录和以后在其中创建的所有目录将由 git 管理,以允许mygroup
读取、写入和执行权限(也设置了 sgid 位 - 以便与mygroup
不是他们的用户一起工作初级组)receive.denyNonFastforwards = 1
: 拒绝非快进推送到 repo如果您想微调用户、组或其他用户的权限,请使用
--shared=0NNN
,文件NNN
的标准用户、组和其他位在哪里(目录上的执行和 sgid 位将由 git 适当管理)。例如,这允许对用户进行读写访问,以及对组的只读访问(并且不能访问其他):这允许对用户和组进行读写访问(并且不能访问其他):
这允许对用户和组进行读写访问,以及对其他用户和组的只读访问:
请注意,如果您不允许对该组进行写访问,请确保首先使用
chown
设置存储库的所有者,然后git init
以该用户身份运行命令(以确保使用正确的所有者初始化存储库所有初始文件和子目录)。在共享存储库中修复权限的一种方法是创建一个更新后的挂钩脚本,以便用户在推送时不会遇到权限问题。这应该适用于任何 git 版本。
假设您在 /myrepo.git 中有一个共享存储库。该存储库中的所有文件都属于mysharedgroup。所有推送到该存储库的用户也应该属于mysharedgroup。现在创建以下文件(将mysharedgroup更改为您的首选项):
/myrepo.git/hooks/post-update
您可以使用 git-daemon 来共享存储库。阅读git-daemon的文档以获取更多信息。
编辑:
另请查看这篇文章8 种共享 git 存储库的方法。
对于现有的存储库,这样做对我有用。这需要从之前的几个答案和评论中获得建议:
从您的存储库父目录,在服务器上:
@stevek_mcc 答案是我在谷歌上搜索这个问题时正在寻找的答案