git删除提交历史

精准入口==>官方文档

Q:我们在提交代码时,把密码或者敏感信息也提交了,怎么办?

A:“在本地删除密码或敏感信息后,再push到远程仓库”

Q:"但这样删除后,在仓库的commit历史中,还是能看到密码呀?"

A:“那就删除commit历史, 但是怎么删呢。。。。”

B:"Using filter-branch"

 

使用方法

1.进入到本地目录

2-1.如果删除文件, 执行如下命令,删除该文件在本地的提交历史:

git filter-branch --force --index-filter "git rm --cached --ignore-unmatch 你的文件的完整名称" --prune-empty --tag-name-filter cat -- --all

2-2.如果删除目录, 执行如下命令,删除该目录在本地的提交历史:

git filter-branch --force --index-filter "git rm --cached --ignore-unmatch 你的目录的完整名称" --prune-empty --tag-name-filter cat -- --all

该命令会强制( --force) git对所有分支和tag的历史记录(--tag-name-filter cat -- -all)执行命令,但是不需要check out(--index-filter)这些历史记录.

该命令会从历史记录中删除指定文件("git rm --cached --ignore-unmatch 你的文件的完整名称")的内容, 并且会删除空提交(--prune-empty)

3.(可选)把文件名加入到.gitignore文件中, 以后提交时,会被过滤掉,防止以后不小心又把敏感数据提交到代码仓库中

echo 文件名 >> .gitignore
git add .
git commit -m "提交时忽略xxxx文件"

4-1.将修改强制提交到远程仓库,远程仓库的commit历史将被修改

git push origin --force --all

4-2.如果tag中也需要删除敏感数据,则执行

git push origin  --force --tags

5.通知各位同事, pull最新的代码, 并使用它做rebase. 在rebase没完成前, 不要把老代码merge回仓库, 因为merge会把之前清除的敏感文件又提交回仓库里.

rebase 会先把本地提交的记录打补丁,然后把本地仓库更新成和远程相同,然后再应用补丁。

merge 是合并, 本地已有的敏感数据还在。 

posted @ 2016-02-17 13:37  JinleiZhang  阅读(19724)  评论(3编辑  收藏  举报