如何设置不同用户只能看到某些部分的 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-commit
和 post-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 存储库?的主要内容,如果未能解决你的问题,请参考以下文章
如何保护我的应用程序的一部分不受某些用户的影响(即,其中一个选项卡式视图只能由某些用户看到)