git删除历史

Git如何永久删除文件(包括历史记录)

有些时候不小心上传了一些敏感文件(例如密码), 或者不想上传的文件(没及时或忘了加到.gitignore里的),

而且上传的文件又特别大的时候, 这将导致别人clone你的代码或下载zip包的时候也必须更新或下载这些无用的文件,

因此, 我们需要一个方法, 永久的删除这些文件(包括该文件的历史记录).

首先, 可以参考 github 的帮助:

https://help.github.com/articles/remove-sensitive-data

步骤一: 从你的资料库中清除文件

以Windows下为例(Linux类似), 打开项目的Git Bash,使用命令:

git filter-branch --force --index-filter ‘git rm --cached --ignore-unmatch path-to-your-remove-file‘ --prune-empty --tag-name-filter cat -- --all

其中, path-to-your-remove-file 就是你要删除的文件的相对路径(相对于git仓库的跟目录), 替换成你要删除的文件即可.

如果你要删除的文件很多, 可以写进一个.sh文件批量执行, 如果文件或路径里有中文, 由于MinGW或CygWin对中文路径设置比较麻烦, 你可以使用通配符*号, 例如: sound/music_*.mp3, 这样就把sound目录下以music_开头的mp3文件都删除了.

例如这样, del-music-mp3.sh:

#!/bin/bash

# git filter-branch --force --index-filter ‘git rm --cached --ignore-unmatch projects/Moon.mp3‘ --prune-empty --tag-name-filter cat -- --all
# git filter-branch --force --index-filter ‘git rm --cached --ignore-unmatch sound/Music_*.mp3‘ --prune-empty --tag-name-filter cat -- --all

如果你看到类似下面这样的, 就说明删除成功了:

Rewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (266/266)
# Ref ‘refs/heads/master‘ was rewritten

如果显示 xxxxx unchanged, 说明repo里没有找到该文件, 请检查路径和文件名是否正确.

注意: 补充一点, 如果你想以后也不会再上传这个文件或文件夹, 请把这个文件或文件夹添加到.gitignore文件里, 然后再push你的repo.

步骤二: 推送我们修改后的repo

以强制覆盖的方式推送你的repo, 命令如下:

git push origin master --force

这个过程其实是重新上传我们的repo, 比较耗时, 虽然跟删掉重新建一个repo有些类似, 但是好处是保留了原有的更新记录, 所以还是有些不同的. 如果你实在不在意这些更新记录, 也可以删掉重建, 两者也差不太多, 也许后者还更直观些.

执行结果类似下面:

Counting objects: 4669, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4352/4352), done.
Writing objects: 100% (4666/4666), 35.16 MiB | 51 KiB/s, done.
Total 4666 (delta 1361), reused 0 (delta 0)
To https://github.com/defunkt/github-gem.git
 + beb839d...81f21f3 master -> master (forced update)

步骤三: 清理和回收空间

虽然上面我们已经删除了文件, 但是我们的repo里面仍然保留了这些objects, 等待垃圾回收(GC), 所以我们要用命令彻底清除它, 并收回空间.

命令如下:

rm -rf .git/refs/original/

git reflog expire --expire=now --all

git gc --prune=now
Counting objects: 2437, done.
# Delta compression using up to 4 threads.
# Compressing objects: 100% (1378/1378), done.
# Writing objects: 100% (2437/2437), done.
# Total 2437 (delta 1461), reused 1802 (delta 1048)
git gc --aggressive --prune=now
Counting objects: 2437, done.
# Delta compression using up to 4 threads.
# Compressing objects: 100% (2426/2426), done.
# Writing objects: 100% (2437/2437), done.
# Total 2437 (delta 1483), reused 0 (delta 0)

注: 绿色字部分是命令执行后的结果.

现在你再看看你的.git目录文件大小是不是变小了.

时间: 2024-10-21 04:52:41

git删除历史的相关文章

git查看历史与乱码解决

1.git查看历史 不需要安装什么乌龟版,直接安装git就用这个功能.(当然可能没乌龟版这么人性化) 注意:git不像svn要联网才行,单机可可以查看历史,因为仓库已经在本地. 打开后: 一般这样子查看历史遇到中文会乱码,请看第二章节. 2.git乱码 [gui] encoding = utf-8 [i18n] commitencoding = gbk [svn] pathnameencoding = gbk 解决:在gitconfig文件只增加[gui]即可! 参考: http://www.d

git 删除本地分支和远程分支、本地代码回滚和远程代码库回滚

[git 删除本地分支] git branch -D br [git 删除远程分支] git push origin :br  (origin 后面有空格) git代码库回滚: 指的是将代码库某分支退回到以前的某个commit id [本地代码库回滚]: git reset --hard commit-id :回滚到commit-id,讲commit-id之后提交的commit都去除 git reset --hard HEAD~3:将最近3次的提交回滚 [远程代码库回滚]: 这个是重点要说的内容

git 删除远程分支 branch

git 删除远程分支 : git push origin :远程分支 例如删除远程分支 osc(楼主的origin是 osc): [email protected] MINGW64 ~/workspace/HelloWorld/src/selenium (master)$ git push osc :oscTo [email protected]:wuzhiyi51/selenium_learn.git - [deleted] osc git 创建分支(branch) git branch te

git查看历史提交记录

#git查看历史提交记录 `git log --pretty=oneline filename`

git 删除与撤回

Git 删除与撤回 标签: git 版本管理 删除文件 撤回删除操作 2017年01月13日 22:56:27786人阅读 评论(0) 收藏 举报  分类: Git(4)  版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/chenxiqilin/article/details/54412526 在工作区删除 我们修改文件的时候,有时也会把文件给删除掉.例如我们把test3.txt从工作区删除.  这个时候我后悔了,想找回来,怎么办?如果你还没提交

git 删除 repository

git 删除 repository 打开版本库,选择要删除的repository 点击Settings 找到删除选项 输入repository name,点击delet…… 删除本地仓库 执行git init命令 在本地目录下找到.git文件 删除.git 删除本地仓库目录文件 $$ MINGW32 ~ $ cd c:/PycharmProjects/test $$ MINGW32 ~/PycharmProjects/test (master) $ pwd /c/Users/china/Pych

linux下SVN定时备份并删除历史备份

利用svnadmin hotcopy可以实现完全备份,但不能进行增量备份.svnadmin hotcopy是将整个库都"热"拷贝一份出来,包括库的钩子脚本.配置文件等:任何时候运行这个脚本都得到一个版本库的安全拷贝,不管是否有其他进程正在使用版本库. 优点是:备份过程较快,灾难恢复也很快:如果备份机上已经搭建了svn服务,甚至不需要恢复,只需要进行简单配置即可切换到备份库上工作. 缺点是:比较耗费硬盘,需要有较大的硬盘支持.在/data/svnbackup目录建立备份脚本svnbak.

7. Git比较历史版本的差异&&删除无用分支

比较历史版本的差异&&删除无用分支 比较历史版本的差异 命令展示 比较两个版本的差异可以使用git diff命令,并利用HEAD参数作为版本的标示 git diff HEAD HEAD 参数详解 A节点,可以包含多个子节点(A节点checkout 出多个分支B,C,D,则他们是A的子节点)A节点可以有多个父节点(B,C,D多个分支合并得到A,则B,C,D都是A的父节点)HEAD代表当前节点^是~都是父节点,区别是跟随数字时候,^2 是第二个父节点,而~2是父节点的父节点^和~可以组合使用,

git删除所有历史提交记录,只留下最新的干净代码

1.Checkout git checkout --orphan latest_branch 2. Add all the files git add -A 3. Commit the changes git commit -am "commit message" 4. Delete the branch git branch -D master 5.Rename the current branch to master git branch -m master 6.Finally,