【问题标题】:Stop Git from pushing secret (but tracked) files阻止 Git 推送秘密(但被跟踪)文件
【发布时间】:2016-05-22 17:11:47
【问题描述】:

使用git,我跟踪了一个名为top-secret.txt 的绝密文件。 如何确保此文件在推送时永远不会离开我的本地系统 到远程(但在本地保持版本控制)?

示例

  • 假设我有一个提交,它更改了名为 top-secret.txt 的秘密文件另一个名为 not-secret.txt 的文件。
  • 推送此提交时将对not-secret.txt 所做的更改传输到远程。
  • top-secret.txt 所做的更改将保留在我的本地系统上。

额外信息: 推送是由持续集成系统执行的,因此我有机会在推送到远程之前在本地执行脚本。

我需要为此设置一个 git 子模块还是有更简单的解决方案?

【问题讨论】:

  • 为什么您需要跟踪只有您可以访问的文件的历史记录?
  • @JérômeBrunel 为了跟踪更改,请保留版本历史记录以及版本控制系统的其他一些关键功能。

标签: git push git-submodules git-remote


【解决方案1】:

我会创建一个子文件夹来包含您的秘密文件,并在该目录中创建一个本地 git 存储库,即git init mysecretsubdir。然后将mysecretsubdir/ 添加到您的.gitignore,这样它就不会被提交到主存储库。这使您可以保留秘密文件的版本历史记录,而无需与他人共享。

当然,这种方法有点老套,但 git 并不是真正为满足您的要求而构建的。您可以做的另一件事是创建一个filter,它会在文件进入索引时自动加密文件,并在文件进入工作目录时对其进行解密。

【讨论】:

  • 感谢您的建议。如果 git 没有为此提供简单的解决方案,我宁愿创建一个 git submodule 以将秘密文件与主存储库分开。
【解决方案2】:

你不能。 Git 的底层对象模型(一切都是以下四种类型之一的对象:提交、树、注释标签或“blob”——即文件)禁止区分“我可以看到但你不能看到的文件”和“文件”每个人都可以看到”。任何拥有存储库副本的人都可以查看存储库中的每个对象。

因此,只有两种方法可以使文件保密:

  • 首先不要将其包含在存储库中,或者
  • 加密。

子模块方法相当于执行其中的第一个,同时还提示缺少某些内容(与“那里但已加密”不同)。

【讨论】:

  • "任何拥有存储库副本的人都可以看到存储库中的每个对象。"我同意这一点。这就是为什么远程可能不是本地存储库的精确副本。而是某些文件,例如top-secret.txt 必须从遥控器中排除。我希望有一些技巧来实现这一点,例如通过将文件列入黑名单以进行 推送(类似于使用 .gitignore 将文件从 提交 中排除/列入黑名单)。
  • @Joshua:不,一般来说 git 根本没有安全模型。它依赖外部程序来提供任何所需的安全性。 一个 前一阵子出现了轻微的异常:一个 git 命令 git archive 将不再允许任意 SHA-1 ID 作为起点,除非您设置了配置标志。但是大多数 git 代码,包括对象级别的所有内容,都没有保护/排除:它只是不在那里。改造一个安全模型会很困难,而且似乎需求很少(可能是先有鸡还是先有蛋,太麻烦 = 没人这样做 = 没有需求 = 太麻烦......)。
  • 感谢您的澄清。提供一个克隆 repo、删除与top-secret.txt 相关的所有最新更改(通过迭代未推送的提交)然后推送到远程的脚本会不会太难?
  • 如上所述,这可能很容易,但并不安全。您不仅必须清除提交,还必须删除任何隐藏的(reflog)引用,然后重新打包所有内容,以确保删除的数据确实被删除。 (通常它们不应该被转移,但我已经看到了明显无法访问的对象无论如何都会在服务器上结束的情况,尽管这可以追溯到 git 1.5.x 和 1.6.x 的时代。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 2012-11-24
  • 2020-01-05
  • 2020-09-26
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
相关资源
最近更新 更多