4

我正在尝试以某种方式使用 git,以使项目中的某些子目录对“不受信任”用户保密/隐藏,但对其他“受信任”用户可见。请注意,这不仅仅是写保护;也不能允许不受信任的用户读取机密文件。我希望用户体验就像是一个单一的 git repo,而不是像子模块这样的东西。

我会告诉你到目前为止我唯一的想法,以防引发一些讨论或批评。我正在考虑在服务器的幕后拥有两个并行存储库。受信任的用户克隆/拉/推受信任的存储库。不受信任的用户克隆/拉/推不受信任的存储库。当对受信任的存储库进行提交时,将对其进行过滤以删除机密内容,然后再将其应用于不受信任的存储库。另一方面,对不受信任的存储库的提交进行过滤,以避免在应用于受信任的存储库之前破坏秘密内容。

我应该如何实现这个目标?我提出的解决方案疯了吗?

4

4 回答 4

4

是的,这是可能的,而且是经常性的需求。

为此,您应该将您的存储库拆分为一些不同的存储库,git submodule并将主题组合到一个存储库中。然后,您关闭对不受信任用户的秘密回购的读取权限。

例如,我的 home 配置是 github 中的公共 repo:https ://github.com/perfectworks/home 。您可以在其中找到一个private目录,该目录是另一个私有 git 存储库的子模块。不受信任的用户不能在这个目录下得到任何东西,除非我授权他们。

您可以在此处找到更多信息:http git submodule: //git-scm.com/book/ch6-6.html

于 2012-05-31T04:00:23.363 回答
2

既然你说你不想使用子模块,你可能想看看git-subtree,它允许你将存储库的子目录拆分到它自己的存储库中,并将刚刚提交的更改合并到那个其他存储库。然后您可以使用以下结构:

full-repo
\
 .git
 public
 private

...并用于git-subtree split生成仅代表public子目录历史的分支,并将该分支提取到新创建的存储库中。然后让特权用户 clone full-repo,而不受信任的用户只能克隆代表public子目录的新存储库。当更改提交到表示public子目录的存储库时,您可以full-repo通过提取到原始存储库并运行git-subtree merge. 同样,在 中所做的更改full-repo可以将影响public传播到拆分分支的部分git subtree split,并将该分支拉入拆分存储库。

请注意,如果要执行此操作,则在将更改传播回表示 的存储库时public,您需要非常小心,不要将私有对象获取到公共存储库中。例如,确保您只获取拆分分支,而不是存储库中的所有内容。我不会在安全性至关重要的情况下使用这种方法,以防万一犯了这种错误。

于 2012-05-31T05:02:41.600 回答
1

没有办法限制对回购部分的访问。

将秘密内容放在不同的存储库中并将该存储库作为主要存储库的子模块是最直接的方法。使两个被过滤的存储库保持同步实际上并不可行

于 2012-05-31T03:53:23.937 回答
1

假设您计划自行破解,这在技术上可能是可行的git。您需要回答的几个问题:

  • 在推送到服务器期间,您将如何识别“秘密”文件?
  • 您将如何确保连接到您的服务器?由于没有其他服务器会正​​确过滤,因此推送到错误的服务器将共享所有秘密内容。

如果你破解 git,一切皆有可能。

于 2012-05-31T03:57:51.087 回答