从Git历史记录中删除敏感文件及其提交

从Git历史记录中删除敏感文件及其提交

我想在GitHub上放置一个Git项目,但是它包含某些带有敏感数据的文件(用户名和密码,比如/config/ployy.rb,用于Capstrano)。

我知道我可以把这些文件名添加到.gitignore但这并不能消除他们在吉特的历史。

我也不想通过删除/.git目录重新开始。

有没有办法在你的吉特历史记录中的一个特定文件的痕迹?


慕容708150
浏览 1013回答 3
3回答

UYOU

就所有实际目的而言,第一你应该担心的是改变你的密码!从您的问题中还不清楚Git存储库是完全本地的,还是您在其他地方是否有远程存储库;如果它是远程的,并且不受其他人的保护,那么您就有问题了。如果在修复之前有人已经克隆了这个存储库,那么他们将在本地机器上复制您的密码,并且您无法强迫他们更新到您的“固定”版本,因为它已经从历史上消失了。你能做的唯一安全的事情就是把你的密码更改到你使用过的任何地方。这样就可以解决了,下面是如何解决这个问题的方法。GitHub正是以常见问题的形式回答了这个问题。:Windows用户注意事项在此命令中使用双引号(“)而不是单引号git&nbsp;filter-branch&nbsp;--index-filter&nbsp;\ 'git&nbsp;update-index&nbsp;--remove&nbsp;filename'&nbsp;<introduction-revision-sha1>..HEAD git&nbsp;push&nbsp;--force&nbsp;--verbose&nbsp;--dry-run git&nbsp;push&nbsp;--force请记住,一旦您将这段代码推送到像GitHub这样的远程存储库中,并且其他人已经克隆了该远程存储库,那么您现在就处于重写历史的情况。在此之后,当其他人试图删除您的最新更改时,他们会收到一条消息,表示这些更改无法应用,因为它不是快速转发。要解决这个问题,他们必须删除现有的存储库并重新克隆它,或者按照“从上游重基中恢复”下面的说明进行操作。git-重基手册.将来,如果您不小心用敏感信息提交了一些更改,但是您会注意到以前推到远程存储库,有一些更简单的修复方法。如果最后一次提交是要添加敏感信息的提交,则可以简单地删除敏感信息,然后运行:git&nbsp;commit&nbsp;-a&nbsp;--amend,这将使用您所做的任何新更改来修改以前的提交,包括使用git rm..如果更改在历史上更久远,但仍未被推送到远程存储库,则可以执行交互式重基:git&nbsp;rebase&nbsp;-i&nbsp;origin/master这将打开一个编辑器,该编辑器具有自上一次使用远程存储库的共同祖先以来所做的提交。将“Pick”更改为“编辑”任何表示带有敏感信息的提交的行,然后保存并退出。GIT将遍历这些变化,并将您留在一个您可以:$EDITOR&nbsp;file-to-fix git&nbsp;commit&nbsp;-a&nbsp;--amend git&nbsp;rebase&nbsp;--continue对于每一个有敏感信息的变更。最终,您将回到您的分支上,您可以安全地推动新的更改。

交互式爱情

我建议这个剧本大卫·安德希尔的作品,对我来说很有魅力。此外,它还添加了这些命令,以清理它留下的混乱:rm&nbsp;-rf&nbsp;.git/refs/original/git&nbsp;reflog&nbsp;expire&nbsp;--all git&nbsp;gc&nbsp;--aggressive&nbsp;--prune完整脚本(全归功于大卫·安德希尔)#!/bin/bashset&nbsp;-o&nbsp;errexit#&nbsp;Author:&nbsp;David&nbsp;Underhill#&nbsp;Script&nbsp;to&nbsp;permanently&nbsp;delete&nbsp;files/folders&nbsp;from&nbsp;your&nbsp;git&nbsp;repository.&nbsp;&nbsp; To&nbsp;use&nbsp;#&nbsp;it,&nbsp;cd&nbsp;to&nbsp;your&nbsp;repository's&nbsp;root&nbsp;and&nbsp;then&nbsp;run&nbsp;the&nbsp;script&nbsp;with&nbsp;a&nbsp;list&nbsp;of&nbsp;paths#&nbsp;you&nbsp;want&nbsp;to&nbsp;delete,&nbsp;e.g.,&nbsp;git-delete-history&nbsp;path1 &nbsp;path2if&nbsp;[&nbsp;$#&nbsp;-eq&nbsp;0&nbsp;];&nbsp;then &nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;0fi#&nbsp;make&nbsp;sure&nbsp;we're&nbsp;at&nbsp;the&nbsp;root&nbsp;of&nbsp;git&nbsp;repoif&nbsp;[&nbsp;!&nbsp;-d&nbsp;.git&nbsp;];&nbsp;then &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"Error:&nbsp;must&nbsp;run&nbsp;this&nbsp;script&nbsp;from&nbsp;the&nbsp;root&nbsp;of&nbsp;a&nbsp;git&nbsp;repository" &nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;1fi#&nbsp;remove&nbsp;all&nbsp;paths&nbsp;passed&nbsp;as&nbsp;arguments&nbsp;from&nbsp;the&nbsp;history&nbsp;of&nbsp;the&nbsp;repofiles=$@ git&nbsp;filter-branch&nbsp;--index-filter&nbsp;\"git&nbsp;rm&nbsp;-rf&nbsp;--cached&nbsp;--ignore-unmatch&nbsp;$files"&nbsp;HEAD#&nbsp;remove&nbsp;the&nbsp;temporary&nbsp;history&nbsp;git-filter-branch#&nbsp;otherwise&nbsp; leaves&nbsp;behind&nbsp;for&nbsp;a&nbsp;long&nbsp;timerm&nbsp;-rf&nbsp;.git/refs/original/&nbsp;&&&nbsp;\ git&nbsp;reflog&nbsp;expire&nbsp;--all&nbsp;&&&nbsp;\ git&nbsp;gc&nbsp;--aggressive&nbsp;--prune如果将最后两个命令更改为以下命令,可能会工作得更好:git&nbsp;reflog&nbsp;expire&nbsp;--expire=now&nbsp;--all&nbsp;&&&nbsp;\ git&nbsp;gc&nbsp;--aggressive&nbsp;--prune=now
打开App,查看更多内容
随时随地看视频慕课网APP