1、如果您的历史记录中还没有包含敏感数据的存储库的本地副本,请将存储库克隆到本地计算机。

git clone https://github.com/YOUR-USERNAME/YOUR-REPOSITORY
Initialized empty Git repository in /Users/YOUR-FILE-PATH/YOUR-REPOSITORY/.git/
remote: Counting objects: , done.
remote: Compressing objects: % (/), done.
remote: Total (delta ), reused (delta )
Receiving objects: % (/), 164.39 KiB, done.
Resolving deltas: % (/), done.

2、切换到存储库的工作目录,克隆完成后库的根目录。

cd YOUR-REPOSITORY

3、运行以下命令,替换为要删除的文件PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA的路径,而不仅仅是文件名。这些论点将:

  • 强制Git处理,但不检查每个分支和标记的整个历史记录
  • 删除指定的文件,以及作为结果生成的任何空提交
  • 覆盖现有标签,重写历史
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' \
--prune-empty --tag-name-filter cat -- --all
Rewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (/)
Ref 'refs/heads/master' was rewritten
Ref 'refs/remotes/origin/master' was rewritten
WARNING: Ref 'refs/remotes/origin/master' is unchanged

4、添加包含敏感数据的文件,.gitignore 以确保您不会意外地再次提交它。

echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"
[master 051452f] Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore
files changed, insertions(+), deletions(-)

5、仔细检查您是否从存储库的历史记录中删除了所需的所有内容,并检查了所有分支机构。

6、一旦您对存储库的状态感到满意,强制推送您的本地更改以覆盖您的GitHub存储库,以及您推送的所有分支:

git push origin --force --all
Counting objects: , done.
Delta compression using threads.
Compressing objects: % (/), done.
Writing objects: % (/), 148.85 KiB, done.
Total (delta ), reused (delta )
To https://github.com/YOUR-USERNAME/YOUR-REPOSITORY.git
+ 48dc599...051452f master -> master (forced update)

7、要从标记版本中删除敏感文件,您还需要强制推送Git标记:

git push origin --force --tags
Counting objects: , done.
Delta compression using up to threads.
Compressing objects: % (/), done.
Writing objects: % (/), 331.74 KiB | bytes/s, done.
Total (delta ), reused (delta )
To https://github.com/YOUR-USERNAME/YOUR-REPOSITORY.git
+ 48dc599...051452f master -> master (forced update)

8、经过一段时间后,您确信 git filter-branch 没有意外的副作用,您可以使用以下命令(使用Git 1.8.5或更高版本)强制取消引用本地存储库中的所有对象并进行垃圾回收:

git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now
Counting objects: , done.
Delta compression using up to threads.
Compressing objects: % (/), done.
Writing objects: % (/), done.
Total (delta ), reused (delta )

9、执行完成后会删除你的操作的数据文件

相关文章:Removing sensitive data from a repository

            彻底清除Github上某个文件的历史(针对误上传密码文件等情况)

04-19 16:47
查看更多