`
lvjun106
  • 浏览: 436957 次
  • 性别: Icon_minigender_1
  • 来自: 芜湖
社区版块
存档分类
最新评论

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目录文件大小是不是变小了.

 

参考自:

http://whoop.sinaapp.com/blog/article/21

http://blog.csdn.net/meteor1113/article/details/4407209

分享到:
评论

相关推荐

    Git仓库清除commit历史记录.docx

    在Git仓库管理中,有时出于隐私、安全或者代码版本重置等需求,我们可能需要清除commit历史记录,将仓库恢复到初次commit的状态。这个过程涉及到对Git仓库的深入操作,包括创建新分支、添加文件、删除旧分支以及强制...

    Git-2.9.2-64-bit.rar git安装文件

    1. **版本控制**:Git是一种版本控制系统,记录文件和目录的每次更改,使用户可以回溯到任何历史版本。 2. **分布式特性**:与集中式版本控制系统(如SVN)不同,Git是分布式的,每个开发者的本地副本都是完整的代码...

    git常用命令和场景

    而Git仓库(Repository)则是本地数据库,保存所有的历史记录和元数据。 Git的状态分为三种:已修改(Modified),表示文件已被修改,但尚未保存到数据库中;已暂存(Staged),表示文件的当前版本已经标记,等待下...

    猴子都能懂的Git入门-整站

    2. Git基本操作:包括初始化仓库、添加文件、提交更改、查看状态和历史记录。 3. 分支管理:介绍如何创建、切换和合并分支,理解分支在开发中的重要作用。 4. 远程仓库:讲解如何与GitHub、GitLab等远程服务进行交互...

    git命令大全

    - `git log -3`:显示最近三次提交的历史记录。 - `git log --oneline`:简洁地显示每条提交记录。 - `git log -p`:显示详细的提交内容差异。 - `git log --stat`:显示提交统计信息。 - `git log --graph`:图形化...

    git常用命令.pdf

    - **永久删除**:若确定不再需要某文件,可执行`git rm <file>`并提交,以彻底从版本库中删除。 #### 工作区、暂存区和版本库的概念 - **工作区**:指本地计算机上可见的项目目录。 - **暂存区**(Stage/Index):...

    Git整理笔记

    请注意,这将永久删除分支及其历史记录,除非使用`-D`强制删除未合并的分支。 19. **暂存工作**: `git stash` 命令用于暂存当前工作。当你需要暂时停止当前的工作,但又不想丢失已经完成的部分时,可以使用此命令。...

    GIT基本操作命令及详解

    查看历史记录,git log命令可以帮助你浏览和检查项目文件的演变。如果需要深入了解历史信息,git log命令后可以跟上不同的参数来过滤或查看特定信息。 GitHub还为Windows和Mac提供了桌面客户端,这些客户端提供了...

    资源管理+GIT拉取+GIT上传

    这将在本地创建一个新的文件夹,包含远程仓库的所有文件和历史记录。 以上就是 Git 初学者进行资源管理的基础操作,包括拉取和上传资源的关键步骤。熟练掌握这些命令,将有助于你更有效地协同开发和管理项目代码。...

    2018尚硅谷Git和GitHub视频教程

    - 永久删除后的文件恢复。 - 删除文件后如何从暂存区恢复。 - **分支管理**: - 创建、合并、切换分支。 - 解决合并时产生的冲突。 - 使用`git merge`和`git rebase`进行分支合并。 - **Git的数据管理机制**: ...

    github-git-cheat-sheet-rt.pdf

    查看历史记录时,`git log`命令能够浏览和检查项目文件的演变过程。此外,本手册还提到GitHub为Windows和Mac系统提供的桌面客户端,这些客户端简化了最常用的仓库操作,并在高级场景下自动更新Git命令行版本。 Git...

    Java进阶版本管理工具Git全套视频教程

    6.7 查看提交历史记录 6.8 回退至历史版本 6.9 文件删除 6.9.1本地删除与恢复 6.9.2从版本库删除 6.9.3从版本库删除,但是不删除本地 6.10 忽略提交 7. Git 的基本使用02-TortoiseGit 操作本地仓库(分支) 7.1 分支的...

    浅析git 删除某次指定的提交问题

    如果要删除远程仓库中的某次提交,需要特别小心,因为这将永久改变历史记录。首先,建议创建一个备份分支,保存当前状态。然后,你可以使用`git reset --hard`来本地回退到想要的版本。为了删除远程分支,你需要先将...

    git 学习_思维导图_git学习_源码

    暂存区用于临时保存更改,而提交则会将这些更改永久保存到历史记录中。 Git的主要操作包括初始化仓库(`git init`),克隆远程仓库(`git clone`),添加文件到暂存区(`git add`),提交更改(`git commit`),...

    GIT权威指南高清版

    仓库是Git存储所有版本信息的地方,工作目录则是你实际编辑文件的地方,暂存区用于临时保存改动,而提交则是将这些改动永久保存到历史记录中。 Git的常用命令包括: 1. `git init`:初始化一个新的Git仓库。 2. `...

    git快速使用手则

    - $git fetch [bookmark] :从远程存储库书签中下载所有历史记录。 - $git merge [bookmark]/[branch] :将远程书签的分支合并到当前本地分支。 - $git push [alias][branch] :上载所有本地分支的提交到远程仓库...

    Git撤销使用方法,详细教学

    请注意,这将永久删除这些提交,因此在执行此操作前请确保你不再需要这些更改。 3. **撤销所有本地的修改,回到远程仓库的状态** 当你发现本地的修改与远程仓库存在冲突或者你希望与远程分支保持一致时,可以使用`...

    git reset 的三个参数.pdf

    1. **--soft**:如果我们使用`git reset --soft`回退到版本2,工作区和暂存区的文件(1.c、2.c、6.c和7.c)将保持不变,但提交历史记录会回到2.c的状态,此时的`git status`不会显示任何待提交的变更,因为所有变更...

    Git+Github常用操作汇总

    2. 分布式架构:每个克隆的Git仓库都包含完整的代码库和历史记录,这有助于团队协作,也增强了系统的鲁棒性。 3. 分支管理:Git的强大分支功能允许开发者在不同的功能分支上工作,而不会影响主分支的稳定性。 安装...

Global site tag (gtag.js) - Google Analytics