为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Git
慕容708150 2019-06-01 10:32:08
从Git历史记录中删除敏感文件及其提交我想在GitHub上放置一个Git项目,但是它包含某些带有敏感数据的文件(用户名和密码,比如/config/ployy.rb,用于Capstrano)。我知道我可以把这些文件名添加到.gitignore但这并不能消除他们在吉特的历史。我也不想通过删除/.git目录重新开始。有没有办法全在你的吉特历史记录中的一个特定文件的痕迹?
查看完整描述

3 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

就所有实际目的而言,第一你应该担心的是改变你的密码!从您的问题中还不清楚Git存储库是完全本地的,还是您在其他地方是否有远程存储库;如果它是远程的,并且不受其他人的保护,那么您就有问题了。如果在修复之前有人已经克隆了这个存储库,那么他们将在本地机器上复制您的密码,并且您无法强迫他们更新到您的“固定”版本,因为它已经从历史上消失了。你能做的唯一安全的事情就是把你的密码更改到你使用过的任何地方。


这样就可以解决了,下面是如何解决这个问题的方法。GitHub正是以常见问题的形式回答了这个问题。:

Windows用户注意事项在此命令中使用双引号(“)而不是单引号

git filter-branch --index-filter \
'git update-index --remove filename' <introduction-revision-sha1>..HEAD
git push --force --verbose --dry-run
git push --force

请记住,一旦您将这段代码推送到像GitHub这样的远程存储库中,并且其他人已经克隆了该远程存储库,那么您现在就处于重写历史的情况。在此之后,当其他人试图删除您的最新更改时,他们会收到一条消息,表示这些更改无法应用,因为它不是快速转发。

要解决这个问题,他们必须删除现有的存储库并重新克隆它,或者按照“从上游重基中恢复”下面的说明进行操作。git-重基手册.


将来,如果您不小心用敏感信息提交了一些更改,但是您会注意到以前推到远程存储库,有一些更简单的修复方法。如果最后一次提交是要添加敏感信息的提交,则可以简单地删除敏感信息,然后运行:

git commit -a --amend

,这将使用您所做的任何新更改来修改以前的提交,包括使用git rm..如果更改在历史上更久远,但仍未被推送到远程存储库,则可以执行交互式重基:

git rebase -i origin/master

这将打开一个编辑器,该编辑器具有自上一次使用远程存储库的共同祖先以来所做的提交。将“Pick”更改为“编辑”任何表示带有敏感信息的提交的行,然后保存并退出。GIT将遍历这些变化,并将您留在一个您可以:

$EDITOR file-to-fix
git commit -a --amend
git rebase --continue

对于每一个有敏感信息的变更。最终,您将回到您的分支上,您可以安全地推动新的更改。


查看完整回答
反对 回复 2019-06-01
?
交互式爱情

TA贡献1712条经验 获得超3个赞

我建议这个剧本大卫·安德希尔的作品,对我来说很有魅力。

此外,它还添加了这些命令,以清理它留下的混乱:

rm -rf .git/refs/original/git reflog expire --all
git gc --aggressive --prune

完整脚本(全归功于大卫·安德希尔)

#!/bin/bashset -o errexit# Author: David Underhill# Script to permanently delete files/folders from your git repository.  
To use # it, cd to your repository's root and then run the script with a list of paths# you want to delete, e.g., git-delete-history path1
 path2if [ $# -eq 0 ]; then
    exit 0fi# make sure we're at the root of git repoif [ ! -d .git ]; then
    echo "Error: must run this script from the root of a git repository"
    exit 1fi# remove all paths passed as arguments from the history of the repofiles=$@
git filter-branch --index-filter \"git rm -rf --cached --ignore-unmatch $files" HEAD# remove the temporary history git-filter-branch# otherwise 
leaves behind for a long timerm -rf .git/refs/original/ && \
git reflog expire --all && \
git gc --aggressive --prune

如果将最后两个命令更改为以下命令,可能会工作得更好:

git reflog expire --expire=now --all && \
git gc --aggressive --prune=now


查看完整回答
反对 回复 2019-06-01
  • 3 回答
  • 0 关注
  • 1010 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信