【问题标题】:how to deploy with git without including sensitive data in history如何使用 git 部署而不在历史记录中包含敏感数据
【发布时间】:2016-08-03 13:57:57
【问题描述】:

有一种方法可以使用 git 管理我的部署和开发工作流程,但不包括历史记录中的敏感数据(例如数据库、秘密令牌等)?我需要更多的分支(例如 master、staging 和 production?)我问这个是因为有一天一个项目可能会成为开源项目,当然,从 git 历史记录或从部署到生产服务器中排除敏感数据将非常有用我总是可以删除 .git 文件夹..但是拥有项目的原始历史可能非常有用..那么我怎样才能避免这个问题呢?谢谢大家。

【问题讨论】:

  • 这是一个非常广泛的问题,并不真正属于 StackOverflow 站点的范围。如果您有兴趣了解解决此问题的概念方法,您可以尝试programmers.stackexchange.com
  • @Cristina 究竟是什么不适合 stackoverflow 网站的范围:s 我的意思是他所问的只是如何防止git 跟踪他不想跟踪的文件
  • @e.doroskevic 也许我误解了——我觉得他想知道处理敏感数据的一般方法,而不是“如何从 git 提交中排除文件”。如果这是他想要的,我收回我原来的评论。
  • @Cristina 我确实认为他给出的描述有点含糊,哈哈,但这是整个网站的普遍问题 x_x
  • @e.doroskevic 我想我对“明确问题”的定义与您的不同 :-) “我想从我的 git 提交中删除用户密码”是一个明确的问题;在我看来,“如何在未来处理将敏感数据提交到 git 的潜在情况”更像是一个通用的编程问题。

标签: git deployment branch remote-server continuous-deployment


【解决方案1】:

摆脱敏感数据

首先,删除您的敏感数据。它在您的代码存储库中没有位置。将您的密码、主机名等转移到存储库之外的配置文件中(当然,您将有一个示例/模板)。

摆脱秘密历史,疯狂的方式

这不会轻易发生。从理论上讲,您可以进行批处理操作,该操作基本上会遍历您的整个提交历史并创建“镜像提交”,其中的每个人都已被某些脚本删除了秘密。对于任何重要的大小(尤其是如果您还想保留分支而不仅仅是主时间线),至少可以说这将是“有趣的”。

这个策略的大致轮廓是这样的:

  1. 在旧存储库 repA 上签出第一个提交。
  2. 创建一个新的空存储库repB
  3. repA 工作目录(不包括.git)的全部内容复制(使用cp)到空的repB 工作目录。
  4. repB 中,执行git add -A ; git commit -m XXX,其中XXX 是来自repA 的原始提交消息。如果repA 中有任何指向当前提交的引用(标签或分支),则在repB 中创建。
  5. repA 中查找当前提交的所有子提交。
  6. 对于每个子提交、签出、冲洗并重复(从第 3 步开始)。

如果你有一个单一的时间线就足够了(即,每次提交只有一个孩子,都在master 分支上),那么这并不难并且非常可行。

如果你想得到你的分支,你也可以这样做,同样的逻辑,只是在每个点递归到所有子节点。跳过除master 之外的任何分支的合并提交;对于master,如上所述提交您的合并提交(不要试图使它们成为“真正的”合并)。

如果您也想进行合并,那么它会变得很疯狂,因为您将不得不再次执行任何和所有冲突解决方案。算了。

我为单个分支做过类似的事情;它有效,但是一旦您解决冲突,就不值得麻烦了。它是一种跨越整个存储库的巨型自动化git rebase -i

切断历史以摆脱秘密

相反,创建一个新的存储库,复制旧存储库的第一个状态,其中不再包含您的秘密,然后提交。完毕。你失去了所有的旧历史。

因此,您可能也不想要这个。

让您的敏感数据不敏感

因此,您的存储库中有秘密。那么,密码可以更改。更改您的密码并完成它。不过,引入配置文件,但不要在意历史。

【讨论】:

    【解决方案2】:

    您可以创建一个名为.gitignore 的文本文件并将其保存到您的项目目录中。在那里,您必须写出您不希望 Git 跟踪的所有文件/扩展名。您甚至可以使用正则表达式,例如 *,它将代表所有文件。即:

    projectfilename/.gitignore
    somefile.txt
    *.php --> will ignore all files with the extension of PHP
    

    有关 .gitignore 的更多信息,您可以查看https://git-scm.com/docs/gitignore

    【讨论】:

      【解决方案3】:

      您可以编写一个.gitignore 文件,其中包含您不希望git 跟踪的文件。例如,假设我想确保 git 不跟踪日志文件

      我可以创建一个.gitignore 文件并编写类似的内容

      logs/*.log
      

      然后addcommit .gitignore 文件和git 将停止跟踪文件夹logs* 具有.log 扩展名的所有文件。

      这里有一些排除模式

      video.mp4 # git will not track this particular file
      *.mp4     # git will not track files with *.mp4 extension
      folder/   # git will not track this file
      

      希望你能明白

      【讨论】:

        【解决方案4】:

        最好的办法是将任何敏感文件添加到 .gitignore 文件中。

        在环境之间移动时,您需要设计一种方法来重新添加这些文件(如果只有 1 个或 2 个文件 - FTP 可能就足够了)。

        或者,在您的应用程序中构建一个异常,确定它缺少文件 - 并根据用户输入自动生成它们。

        如果您曾经将 WordPress 与 Git 结合使用,那么您已经体验过这一点。 WordPress 有一个名为 wp-config.php 的配置文件 - 其中包含所有数据库连接信息。显然,这是您不想分享的东西(而且它也可能会在开发环境之间发生变化)。

        因此 - wp-config.php 从版本控制中被忽略。将WordPress部署到新环境时,检测到wp-config.php不存在,并生成新版本;在询问数据库信息后。

        希望这会有所帮助。

        【讨论】:

          【解决方案5】:

          一种方法是将所有敏感数据保存在项目的子文件夹中。然后可以使用 git submodule 或 git subtree 管理此子文件夹。如果您的项目与将敏感数据保存在一个文件夹中不兼容,您可以将其存储在一个文件夹中并使用 Makefile/script/etc 将敏感数据复制到所需位置并使用 .gitignore 以防止将其签入 git .

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-03-10
            • 2020-05-08
            • 1970-01-01
            • 1970-01-01
            • 2016-04-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多