【问题标题】:How do store sensitive files in my repo without tracking it? [duplicate]如何在我的仓库中存储敏感文件而不跟踪它? [复制]
【发布时间】:2021-05-27 02:04:18
【问题描述】:

我有一个未跟踪的 json 设置文件,其中包含本地开发机器和生产服务器上所需的敏感身份验证数据。在服务器上的每次构建部署之后,我都必须使用适当的凭据信息来煞费苦心地对其进行编辑。

我更喜欢将带有空字段的 json 文件存储在我的 repo 中,以便以后可以通过我的构建脚本填写凭据,或者在 repo 初始化后由其他开发人员填写:

{
     "username": ""  // to be filled by build or user
     "password" : ""  // ditto gitto
}

当然,出于安全原因,不应跟踪该文件。过去我遇到过几种使用 Git 实现的方法,但它们都需要用户主动执行额外的步骤,例如将文件添加到 .ignore 中,如果不执行会带来安全风险. Git 中是否有任何功能可以解决此问题?

【问题讨论】:

  • 考虑使用环境变量
  • @evolutionxbox 填写它是容易的部分,但创建文件而不自动跟踪它是我遇到困难的部分。
  • 这就是为什么使用环境变量是个好主意。它们没有添加到 git 存储库中
  • 我认为这是最接近的: git update-index --no-skip-worktree 但我不明白它是如何工作的。

标签: git repository tracking


【解决方案1】:

主题行中问题的答案:

如何在不跟踪的情况下将敏感文件存储在我的仓库中?

是:你没有

原因很简单:Git 从 Git 的 index 中的任何内容构建新的提交。索引a.k.a. 暂存区 保存了将进入下一次提交的文件副本。它最初是通过复制 current 提交中的文件来填充的。这些相同的文件被复制到您的工作树,以便您可以查看和处理它们。1 然后,当您修改工作树副本时,您运行 git add 到将工作树版本复制回 Git 的索引,以便提议的 next 提交也被更新。

跟踪的文件 是 Git 索引中的文件。因此建议在您的下一次提交中。如果您取消跟踪该文件(通过从 Git 的索引中删除它),建议下一次提交应该忽略该文件,即在两次提交之间删除该文件。

答案——嗯,一个答案——文本中的问题:

我更喜欢将带有空字段的 json 文件存储在我的 repo 中,以便以后可以通过我的构建脚本填写凭据,或者在 repo 初始化后由其他开发人员填写:

{
     "username": ""  // to be filled by build or user
     "password" : ""  // ditto gitto
}

是利用Git的smudgeclean过滤机制,使得存储的文件,在Git中,省略掉敏感数据,而工作树 同一文件的副本(您可以在文件查看器中查看并在编辑器中编辑的数据)显示它。

涂抹和清洁过滤器机制有点棘手,粗心可能会导致敏感数据在存储库中结束。

过去我遇到过几种使用 Git 实现的方法,但它们都需要用户主动执行额外的步骤...

设置涂抹和清洁过滤器也有同样的问题。但是,一旦设置完成,clean 过滤器可以获取具有敏感数据的工作树副本,并将文件内容中的敏感数据 out 作为文件剥离从您的工作树复制到 Git 的索引中。所以提议的 next 提交没有敏感数据。 smudge 过滤器可以将敏感数据放回文件中,因为它是从提交或 Git 的索引复制到您的工作树副本。 (当然,您的污迹过滤器需要某处获取敏感数据。那么:你将实际数据保存在哪里?为什么不把它保存在那里并且只 那里?2)

一般来说,正确的答案是:根本不要把这些东西放在 repo 中。代替需要填写的 json 文件,提供 example(或“模板”)json 文件,或将该数据保存在其他文件中。


1Git 的文件索引副本与您的同一文件的工作树副本之间的区别是……好吧,请参阅涂抹和清洁过滤器的东西,但重要的是Git 本身 的不同之处在于 Git 索引中的副本已经是 Git 用来存储文件的特殊格式。此格式经过压缩和重复数据删除,不使用您的操作系统使用的存储系统。因此,它可以保存您的操作系统无法发音的文件,具体取决于您的操作系统。它的提交速度也非常快:例如,它不需要扫描数据来压缩和重复数据删除。

2方便、固执、怨恨、固执……有很多充分的理由! ?

【讨论】:

  • @ATL_DEV: 随意写出更好的替代品!
  • (顺便说一句,我的意思是认真的。Git 可能是积极的用户敌对,尤其是对 Git 新手;因此,我花费了我生命中的重要时间来揭开它的神秘面纱。在 Git 和 Hg 之间, Hg 显然有更好的用户体验,但不知何故输掉了人气之战,我们现在都在这件事上。作为一个“技术人员”,我知道我不会设计用户界面,但我知道什么时候我们'处于技术噩梦中。)
  • 我用过 Git 很多次,它总是把我的废话弄糊涂到极度沮丧的地步。每次使用它时,我总是发现自己重新学习它。它的支持者声称你只需要知道一些命令,但你可以看出他们不是超级用户。 Git 是泄漏抽象的典型代表。它的接口实际上是一个通过命令行接口公开的低​​级 API。 GUI 也没有提供比 CLI 更多的好处。它们只是将 CLI 命令转换为 UI 元素,但确实提供了更好的存储库及其状态的可视化。
  • Mercurial 更容易理解。它抽象出不必要的细节。你不需要了解它的内部数据结构和算法。 Mercurial 中的合并很简单,但会用不同的类型和选项让您不知所措:变基、快进、我们、他们的等等。虽然它提供了更多控制权,但代价是陡峭的倾斜曲线。例如,当恢复就足够时,没有理由进行重置和恢复。不想看到反向提交?无论如何都不应该显示它们,因为它们不重要。
猜你喜欢
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 2019-07-01
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多