阻止 Git 推送秘密(但已跟踪)文件
Stop Git from pushing secret (but tracked) files
使用 git
我跟踪了一个名为 top-secret.txt
的绝密文件。
如何确保此文件在推送时永远不会离开我的本地系统
到远程(但在本地保持版本控制)?
例子
- 假设我有一个提交更改了名为
top-secret.txt
的秘密文件和 另一个名为 not-secret.txt
. 的文件
- 推送此提交时 仅 对
not-secret.txt
所做的更改应传输到远程。
- 对
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,它会在您的文件进入索引时自动加密它,并在它进入您的工作目录时自动解密它。
使用 git
我跟踪了一个名为 top-secret.txt
的绝密文件。
如何确保此文件在推送时永远不会离开我的本地系统
到远程(但在本地保持版本控制)?
例子
- 假设我有一个提交更改了名为
top-secret.txt
的秘密文件和 另一个名为not-secret.txt
. 的文件
- 推送此提交时 仅 对
not-secret.txt
所做的更改应传输到远程。 - 对
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,它会在您的文件进入索引时自动加密它,并在它进入您的工作目录时自动解密它。