我正在尝试以一种方式使用git,使项目中的某些子目录保密/隐藏“不受信任”的用户,但对其他“受信任”用户可见。请注意,这不仅仅是写保护;不允许不受信任的用户读取密码文件。我希望用户体验好像是一个单独的git repo,而不是像子模块那样。
到目前为止,我会告诉你我唯一的想法,如果引起一些讨论或批评。我正在考虑在服务器后面有两个平行的回购。受信任的用户克隆/拉/推受信任的仓库。不受信任的用户克隆/拉/推不受信任的回购。当对受信任的存储库进行提交时,会对其进行过滤以在应用于不受信任的存储库之前删除机密内容。转向另一个方向,过滤不受信任的回购邮件,以避免在应用于受信任的回购邮件之前破坏秘密内容。
我应该如何实现这一目标? 我提出的解决方案是疯了吗?
答案 0 :(得分:4)
是的,这是可能的,也是常规需求。
要做到这一点,您应该将您的仓库拆分为一些不同的仓库,并使用git submodule
将主题组合到一个仓库中。然后关闭对不信任用户的秘密回购的读取权限。
例如,我的home配置是github中的公共仓库:https://github.com/perfectworks/home。你可以在那里找到一个private
目录,它是另一个私有git仓库的子模块。除非我正确授权,否则不受信任的用户无法在此目录下获取任何内容。
您可以在此处找到有关git submodule
的更多信息:http://git-scm.com/book/ch6-6.html。
答案 1 :(得分:1)
无法限制对回购零件的访问。
将秘密内容放在不同的仓库中并将该仓库作为主仓库的子模块是最直接的方式。保持同步两个被过滤的回购不可行
答案 2 :(得分:1)
假设您计划破解git
本身,这在技术上可能是可行的。您需要回答几个问题:
如果你攻击git,一切皆有可能。
答案 3 :(得分:1)
由于您说您不想使用子模块,因此您可能需要查看git-subtree,它允许您将存储库的子目录拆分到其自己的存储库中,并合并返回更改那些只是提交给其他存储库的。然后你可以使用结构:
full-repo
\
.git
public
private
...并使用git-subtree split
生成一个仅代表public
子目录的历史记录的分支,并将该分支提取到新创建的存储库中。然后,让特权用户克隆full-repo
,而不受信任的用户只能克隆代表public
子目录的新存储库。当更改提交到表示public
子目录的存储库时,您可以通过获取原始存储库并运行full-repo
将该历史记录合并到git-subtree merge
。同样,full-repo
中所做的更改可能会影响使用public
传播到拆分分支的git subtree split
部分,并将该分支拉入拆分存储库。
请注意,如果要执行此操作,在将更改传播回代表public
的存储库时,您需要非常小心,不要将私有对象提取到公共存储库中。例如,确保只获取拆分分支,而不是存储库中的所有内容。我不会在安全性至关重要的情况下使用这种方法,以防万一出现这种错误。