如何设置不同用户只能看到某些部分的 git 存储库?

Posted

技术标签:

【中文标题】如何设置不同用户只能看到某些部分的 git 存储库?【英文标题】:How to set up a git repository where different users can only see certain parts? 【发布时间】:2010-11-14 20:13:19 【问题描述】:

如何建立一个 git 存储库,让一些用户可以看到源代码的某些部分,而其他用户可以看到全部?我看过很多只授予某些用户提交访问权限的指南,但这些都假设每个人都应该具有读取权限。我也听说过 gitosis,但我不确定它是否支持这一点,并且一年多来没有任何提交,所以我认为它已经死了。

【问题讨论】:

【参考方案1】:

原生 git 协议不支持这个; git 在很多地方都假设每个人都有一份完整历史的所有副本。

也就是说,一种选择可能是使用git-subtree 将存储库的一部分拆分为自己的子存储库,并定期合并回来。

【讨论】:

【参考方案2】:

Git 不支持对存储库的访问控制。但是,您可以通过使用hooks,更具体地说是update 挂钩,对存储库自己实施访问控制。

【讨论】:

【参考方案3】:

简而言之:你不能。 Git 是基于快照(至少在概念级别)的版本控制系统,而不是基于变更集的版本控制系统。它将项目(存储库)视为一个整体。历史是一个项目的历史,而不是单个文件历史的联合(它不仅仅是每个文件历史的连接)。

使用 contrib 中的 update-paranoid 钩子之类的钩子,或 gitolite 的 VREFs 机制,您可以允许或禁止访问存储库,您可以允许或禁止访问单个分支。您甚至可以禁止任何更改指定子目录中内容的提交。但项目始终被视为一个整体。

好吧,您可以做一件事:将您想要限制访问的目录放入 子模块,并限制对该子模块存储库的访问。

【讨论】:

Git 不是基于变更集的?? 不,不是。提交对象指向代表存储库状态快照的树对象。变更集是当前提交和父提交的两棵树之间的差异。【参考方案4】:

Jörg 已经指出您可以使用钩子来执行此操作。您需要的具体挂钩取决于您的设置。如果您想要推送到的仓库的权限,您将需要update 钩子,就像他说的那样。但是,如果它在您实际工作的仓库中(提交和合并),您还需要 pre-commitpost-merge 挂钩。 githooks manpage(Jörg 也与此链接)指出,实际上 contrib 部分中有一个脚本演示了一种执行此操作的方法。你可以通过获取一个 git tarball 来获得它,或者将它从 git 的 gitweb 存储库中拉出来:setgitperms.perl。即使您只使用更新挂钩,这也可能是一个有用的模型。

【讨论】:

【参考方案5】:

一般来说,Git 不是为此而设计的。到目前为止,它似乎只在存储库级别具有开箱即用的访问控制。

但是,如果您只需要在 Git 存储库中隐藏部分机密信息(通常是这种情况),您可以使用 git-crypt (https://github.com/AGWA/git-crypt) 和基于用户 GPG 密钥 (https://gnupg.org/) 共享的加密密钥)。

如果您可以将代码库分解为逻辑部分,您也可以使用 git 子模块 (https://git-scm.com/book/en/v2/Git-Tools-Submodules)。然后所有用户只能访问某些存储库,然后您通过子模块将其集成到“大型”代码库中,您可以在其中添加其他代码并只允许“特权”用户使用。

【讨论】:

以上是关于如何设置不同用户只能看到某些部分的 git 存储库?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置公共 git 存储库?

如何保护我的应用程序的一部分不受某些用户的影响(即,其中一个选项卡式视图只能由某些用户看到)

如何使用 GitLab 克隆 git 存储库

如何在竹子构建期间仅检查 git 存储库的一部分?

如何在服务器上设置 git 存储库,并允许多个用户执行 git pull,而不是由一个用户拥有?

管理 svn、git 或 cvs 的工具