阻止 Git 推送秘密(但已跟踪)文件

Stop Git from pushing secret (but tracked) files

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

例子

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

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

你不能。 Git 的底层对象模型(一切都是四种类型之一的对象:提交、树、注释标签或 "blob"——即文件)禁止区分 "file I can see but you can't" 和"file everyone can see"。拥有存储库副本的任何人都可以看到存储库中的每个对象。

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

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

子模块方法相当于执行其中的第一个,同时还提示缺少某些内容(与 "there but encrypted" 不同)。

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

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