AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 26954
Accepted
Andrey Fedorov
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 10 个回答
  • 287698 Views

10 个回答

  • Voted
  1. 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(第二行)。

    希望这能让你上路。

    • 203
  2. 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 分支,应该提供分支级别的权限,但不能说我每个人都亲自使用过它。

    • 131
  3. Niels Joubert
    2011-03-09T21:52:09+08:002011-03-09T21:52:09+08:00

    这个还没有说,所以我想快速添加它。

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

    [core]
        sharedRepository = true
    

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

    • 56
  4. jtimberman
    2009-06-17T23:35:50+08:002009-06-17T23:35:50+08:00

    Git 用户手册描述了如何以多种方式共享存储库。

    • 通过Git Daemon导出。
    • 通过HTTP导出。
    • CVS/SVN 风格,开发人员推/拉的单一共享存储库。

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

    • 甲状腺肿大
    • GitHub(或 GitHub防火墙安装)

    我们为 6 名开发人员组成的团队使用 GitHub。

    • 22
  5. mt3
    2011-01-20T00:55:31+08:002011-01-20T00:55:31+08:00

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

    • 9
  6. 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
    
    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=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以该用户身份运行命令(以确保使用正确的所有者初始化存储库所有初始文件和子目录)。

    • 8
  7. 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
    
    • 6
  8. Vihang D
    2009-06-17T18:58:56+08:002009-06-17T18:58:56+08:00

    您可以使用 git-daemon 来共享存储库。阅读git-daemon的文档以获取更多信息。

    编辑:

    另请查看这篇文章8 种共享 git 存储库的方法。

    • 3
  9. 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
    
    • 3
  10. interestedparty333
    2017-03-30T11:02:20+08:002017-03-30T11:02:20+08:00

    @stevek_mcc 答案是我在谷歌上搜索这个问题时正在寻找的答案

    git clone --config core.sharedRepository=true
    
    • 0

相关问题

  • 可以在 WinXP 中制作一个同时可执行和不可读的文件吗?

  • 如何让 setfacl 在 Linux 上递归地设置 ACL 权限?

  • 将权限委托给 TFS 项目中的子文件夹

  • 在 Vista 中提升 Windows 安装程序

  • 如何授予对 Exchange 2007 中每个人的日历的访问权限?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve