如何在一台机器上与多个用户共享 Git 存储库?

And*_*rov 231 permissions users git share

我在登台服务器上有一个 Git 存储库,多个开发人员需要能够拉取到该存储库。git-init似乎有一个与我正在寻找的标志非常接近的标志:--shared,除了我也希望多个人拉到该存储库。的git-clone--shared标志做完全不同的事情。

更改现有存储库权限的最简单方法是什么?

wom*_*ble 201

权限是害虫。

基本上,您需要确保所有这些开发人员都可以写入 git 存储库中的所有内容。

跳至 New-Wave 解决方案,了解授予一组开发人员编写能力的卓越方法。

标准解决方案

如果您将所有开发人员放在一个专门创建的组中,原则上您可以这样做:

chgrp -R <whatever group> gitrepo
chmod -R g+swX gitrepo
Run Code Online (Sandbox Code Playgroud)

然后umask将用户的更改为002,以便使用组可写权限创建新文件。

这方面的问题很多。如果您使用的是假定 aumask的发行版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
Run Code Online (Sandbox Code Playgroud)

这为组设置了扩展 ACL,以便组成员可以读/写/访问任何已经存在的文件(第一行);然后,还告诉所有现有目录新文件应该应用相同的 ACL(第二行)。

希望这能让你上路。

  • git init 有一个名为 --shared 的参数,它为小组工作设置 core.sharedRepository 变量。您还可以在现有存储库上设置变量。这消除了手动设置 umask 的需要,因为 git 会在操作文件之前将其设置为合理的值。 (66认同)
  • `chmod -R g+swX gitrepo` 会将 setguid 位应用于文件,这是一个安全风险。相反,您可以使用 `find 。-type d -exec chmod g+s {} +` 仅将其应用于目录。 (12认同)
  • +1 为 POSIX 扩展属性 - 对我来说是个新闻! (7认同)
  • 当我执行 `chmod -R g+swX` 时,它让 Git 非常不高兴,并决定它不再是一个 git 存储库(“repo 似乎不是一个 git 存储库”)。我不得不 chmod gs 所有*文件*。要在 *directories* 上设置 setgid 位,请尝试`find /path/to/repo -type d -print0 | xargs -0 chmod g+s`。仍然执行`chgrp -R thegroup /path/to/repo`。 (5认同)

小智 130

如果您创建了存储库(或从现有存储库中克隆了一个新的裸存储库)

$ git init --shared=group 
Run Code Online (Sandbox Code Playgroud)

或者

$ git init --shared=0NNN
Run Code Online (Sandbox Code Playgroud)

Git 应该处理超出默认 umask 提供的权限。最后,这在我的 Git 版本(1.6.3)上是正确的。当然,这假设您的用户在同一组中。

但是,如果我需要管理具有不同读/写程度的多个组中的用户,我会选择 gitosis。我也听说过 gitolite ( http://github.com/sitaramc/gitolite ),这是一个 gitosis 分支,应该提供分支级别的权限,但不能说我个人都使用过它。

  • 顺便说一句,上面的“组”是一个关键字,而不是您组名的占位符。您可以使用 chgrp 命令分配组。对于新的存储库,它是 `git init --bare --shared=group myproj`,其中 myproj 是您的存储库名称,然后是 `chgrp -R mygroup myproj`,其中 mygroup 是您的组名。 (24认同)
  • 这绝对是正确的答案。 (9认同)
  • 我有这个问题,这是迄今为止最好的答案。唯一的问题是 `--shared` 参数采用八进制,而不是十六进制。我已经在 Git 1.7.8 的源代码中确认了这一点,第二个例子应该是`git init --shared=0NNN`。 (4认同)
  • 什么是“NNN”——权限掩码或组号或其他什么? (3认同)
  • 请注意,如果您的用户在他们的默认组与应有的不同时进行提交,则可能会搞砸。要解决此问题,您需要每个用户将他们在 repo 中拥有的每个文件 chgrp 到正确的组。除非您在提交和推送之前弄清楚如何让每个人在正确的组下/向正确的组创建/切换新文件,否则这种情况会再次发生。 (2认同)

小智 56

这个还没说,想赶紧补充一下。

为确保权限问题不会引起他们的丑陋,请确保在 git 共享存储库的配置文件中设置以下内容:

[core]
    sharedRepository = true
Run Code Online (Sandbox Code Playgroud)

这将确保您的系统的“umask”设置得到尊重。

  • 这和 user35117 的答案是正确的。请注意,“true”与“group”相同,可以使用命令`git config core.sharedRepository true`设置。 (16认同)
  • 根据 git-config(1) (http://kernel.org/pub/software/scm/git/docs/git-config.html) core.sharedRepository,您需要将其设置为“umask”或“false”让 git 尊重用户的 umask。 (7认同)
  • 如果你想在克隆时而不是事后进行设置,`git init --shared` 的等价物是 `git clone --config core.sharedRepository=true`。奇怪的 git 在类似的命令中使用 `--shared` 来表示不同的含义。 (3认同)

jti*_*man 22

Git的用户手册介绍如何共享资源库在几个方面。

更复杂但功能齐全的共享存储库的方法是:

我们将 GitHub 用于一个由 6 名开发人员组成的团队。

  • 当您共享存储库时,人们将能够从中提取。他们可能需要克隆它,或者添加一个远程分支。我链接的文档将非常清楚地引导您解决问题;我已经使用了所描述的所有方法来帮助开发人员将源代码与 Git 协作。据我所知,ServerFault 不适用于手持。 (3认同)
  • 我必须同意使用 Gitosis。它通过使用由多个 SSH 密钥验证的单个帐户来解决权限问题。它也完全通过 git commits 自己管理。 (3认同)

mt3*_*mt3 9

还可以查看gitolite来托管您的 git 存储库。Gitosis 显然不再被开发了。


小智 7

从有关设置新存储库的各种其他答案和评论中汇总一些好的建议:

如果你正在建立一个全新的回购myrepo/srv/git该组mygroup,这是你想要什么:

mkdir /srv/git/myrepo.git
chgrp mygroup /srv/git/myrepo.git
git init --bare --shared /srv/git/myrepo.git
Run Code Online (Sandbox Code Playgroud)
  1. 第一行创建 repo 目录
  2. 第二行将其组设置为 mygroup
  3. 第三行使用以下配置初始化一个裸仓库:
    1. core.bare = true: 让它成为一个裸仓库
    2. core.sharedrepository = 1(同core.sharedrepository = group):repo 目录和以后在其中创建的所有目录将由 git 管理以允许mygroup读取、写入和执行权限(同时设置 sgid 位 - 以便与mygroup不属于其的用户一起工作主要组)
    3. receive.denyNonFastforwards = 1: 拒绝非快进推送到 repo

如果要微调用户、组或其他用户的权限,请使用--shared=0NNNNNN标准用户、组和其他文件位在哪里(目录上的 execute 和 sgid 位将由 git 适当管理)。例如,这允许对用户进行读写访问,以及对组的只读访问(其他人无权访问):

git init --bare --shared=0640 /srv/git/myrepo.git
Run Code Online (Sandbox Code Playgroud)

这允许对用户和组进行读写访问(并且不能访问其他人):

git init --bare --shared=0660 /srv/git/myrepo.git
Run Code Online (Sandbox Code Playgroud)

这允许对用户和组进行读写访问,以及对其他人的只读访问:

git init --bare --shared=0664 /srv/git/myrepo.git
Run Code Online (Sandbox Code Playgroud)

请注意,如果您不打算允许对该组的写访问权限,请确保首先使用chown设置存储库的所有者,然后git init以该用户身份运行该命令(以确保使用正确的所有者对存储库进行初始化)所有初始文件和子目录)。


bkm*_*mks 5

修复共享存储库中的权限以便用户在推送时不会遇到权限问题的一种方法是创建一个更新后挂钩脚本来执行此操作。这应该适用于任何 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
Run Code Online (Sandbox Code Playgroud)