如何使用git进行部署而不包括历史记录中的敏感数据

时间:2016-08-03 13:57:58

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

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

5 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

摆脱敏感数据

首先,摆脱敏感数据。它在您的代码存储库中没有位置。将您的密码,主机名等传输到存储库外部的配置文件(当然,您将在里面有一个示例/模板)。

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

它不会轻易发生。理论上,您可以执行批处理操作,该操作基本上会遍历整个提交历史记录并创建"镜像提交",其中每个人都有一些脚本删除了秘密。对于任何非平凡的大小(特别是如果你还想保留分支而不仅仅是主时间轴),这将是有趣的"至少可以说。

这个策略的大纲是:

  1. 检查旧存储库repA上的第一次提交。
  2. 创建一个新的空存储库repB
  3. cp工作目录(不包括repA)的全部内容复制(使用.git)到空的repB工作目录。
  4. repB中,执行git add -A ; git commit -m XXX,其中XXX是来自repA的原始提交消息。如果repA中有任何引用当前提交的引用(标记或分支),则在repB中创建。
  5. repA中查找当前提交的所有子提交。
  6. 为每个孩子提交,结账,冲洗和重复(从第3步开始)。
  7. 如果你只有一个时间线就足够了(即每次提交只有一个孩子,全部都在master分支上),那么这并不难,也很可行。

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

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

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

    切断历史以摆脱秘密

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

    由于这个原因,你可能也不想要这个。

    使您的敏感数据不敏感

    所以你的资料库中有秘密。那么,密码可以改变。更改密码并完成密码。不过,介绍一下配置文件,但不要为历史烦恼。

答案 2 :(得分:0)

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

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

的内容
logs/*.log

然后addcommit .gitignore文件和git将停止跟踪logs文件夹*所有.log文件} extension。

以下是一些排除模式

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

希望你明白这个想法

答案 3 :(得分:0)

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

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

或者,在您的应用程序中构建一个例外,它会丢失文件,并根据用户输入自动生成它们。

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

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

希望这有帮助。

答案 4 :(得分:0)

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