一些时候由于开发初期经验不足和贪图方便, 会把一些不应该提交到 Git 的文件上传到 Github, 带来一系列安全问题, 更有可能是把一些大文件上传到 GitHub 上, 导致项目非常臃肿, 每次 pull、push 都要花费很多时间.

超 100000 个 GitHub 代码库泄露了 API 或加密密钥

关于如何更好的管理大文件, 可以阅读 更好的在 Git 项目中保存大文件(Git LFS 的使用) - 质子 - 博客园.

这时候就可以寻求一些特殊的工具的帮助, BFG Repo-Cleaner by rtyley 就是这样一款工具, 可以从 Git 项目中彻底删除某一个文件的历史记录.

下载及运行

BFG Repo-Cleaner是由 Scala (一种JVM语言) 写成, 所以会被编译成 jar 包, 下载非常方便, 下载地址可在官网或直接点击 bfg 下载地址.

但因此运行 bfg.jar 就需要 Java 环境, 关于 Java 环境的安装, macOS可以参考 macOS 的 JDK 安装问题, 而 Windows 已经有很多人提过, 不做赘述.

让它完全消失

首先需要自行从项目中删除不想要的文件并提交, 这样能最大程度避免误删、误操作.

## 首先需要自行从项目中删除不想要的文件
rm file-to-delete ## 提交改动, 即最新分支是不包含要被删除的文件
git commit -m "删除 file-to-delete"
git push

然后使用 --mirror 命令裸克隆(clone)整个项目.

git clone --mirror git@github.com:username/some-project.git

## 根据经验, 如果是包含大文件的项目, 使用 ssh 将会克隆的非常缓慢, 可以改用 https
git clone --mirror https://github.com/username/some-project.git ## 这个时候, 你的当前目录下就会产生一个名为 some-project.git 的文件夹

接着开始删除文件历史.

## 根据情况的不同, bfg 可选择根据文件大小删除
java -jar bfg.jar --strip-blobs-bigger-than 100M some-project.git ## 根据情况的不同, bfg 可选择直接根据名字删除
java -jar bfg.jar --delete-files name-of-file some-project.git

任选以上命令执行其中一个后, 执行 git gc 真正删除这些文件并提交.

cd some-project.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push

这时候那个文件就会消失了…

彻底删除 Git 项目中的文件(BFG Repo-Cleaner 用法)的更多相关文章

  1. 如何永久删除git仓库中敏感文件的提交记录

    如何永久删除git仓库中敏感文件的提交记录 参考: 1. https://help.github.com/articles/remove-sensitive-data/

  2. git忽略文件并删除git仓库中的文件

    问题描述 不慎在创建.gitignore  文件之前的时候将文件push到了 git仓库,即使之后在.gitignore文件中写入新的过滤规则,这些规则也不会起作用的,git依然会对所有git仓库中的 ...

  3. 如何删除GIT仓库中的敏感信息

    如何删除GIT仓库中的敏感信息 正常Git仓库中应该尽量不包含数据库连接/AWS帐号/巨大二进制文件,否则一旦泄漏到Github,这些非常敏感信息会影响客户的信息安全已经公司的信誉.公司可能其它还有相 ...

  4. (转) eclipse项目中.classpath文件详解

    背景:对于java项目中.classpath文件中的相关定义一直不是很了解,有必要进行深入的学习. 1 前言 在使用eclipse或者myeclipse进行Java项目开发的时候,每个project( ...

  5. 对Android项目中的文件夹进行解释

    对Android项目中的文件夹进行解释: · src:里面存放的是Activity程序,或者是以后的其他组件,在此文件夹之中建立类的时候一定要注意,包名称不能是一级. · gen:此文件夹中的内容是自 ...

  6. 如何查看.Net源代码vs版本号以及C#项目中各文件的含义

    查看.Net源代码vs版本号以及C#项目中各文件的含义 用记事本打开vs项目的.sln文件. 第2行就是这个源代码包的开发软件vs版本号了 注意了,如果是vs2003的sln文件通常没有这行,可以判断 ...

  7. MyEclipse项目中的文件点击右键Team选项中没有提交到SVN中的选项是怎么回事

    MyEclipse项目中的文件点击右键Team选项中没有提交到SVN中的选项是怎么回事 其实你已经可以百度到很多方法: 例如下面博客提供的 http://www.xuebuyuan.com/95285 ...

  8. Vue项目中的文件/文件夹命名规范

    Vue项目中的文件/文件夹命名规范 0.2262018.09.21 16:01:09字数 820阅读 6979 文件或文件夹的命名遵循以下原则: index.js 或者 index.vue,统一使用小 ...

  9. 删除c++项目中的类

    关闭引擎和vs 在工程目录中删除Source文件夹下相应的cpp和h文件 删除工程目录的saved 文件夹和intermediate文件夹 删除工程目录中binaries文件夹内的所有内容 右键工程文 ...

随机推荐

  1. mysql多字段排序

    在对数据库进行查询的时候有时候需要将查询的结果按照某字段升序或者降序排列,甚至有时候需要按照某两个字段进行升降序排列.如果按照某一字段进行排列,只需要在查询语句最后写上 "order by ...

  2. Tomcat Server 原理

    构成: 1.server代表整个catalina serverlet容器 2.service:由一个或多个connector以及一个共享的engine处理引擎组成 3.connector 在指定端口上 ...

  3. apache2.4配置虚拟主机

    step1 启用 httpd-vhosts.conf 找到E:/apache/Apache24/conf 中httpd.conf 文件,取消注释下面这句话 step2 在 httpd-vhosts.c ...

  4. Java 螺纹第三版 第三章数据同步 读书笔记

    多线程间共享数据问题 一.Synchronizedkeyword      atomic一词与"原子"无关,它以前被觉得是物质的最小的单元,不能再被拆解成更小的部分.      当 ...

  5. [补档][JLOI 2017]聪明的燕姿

    [NOI 2008]假面舞会 题目 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 我听见风来自地铁和人海 我排着队拿着爱的号码牌 ...

  6. 谷歌、火狐浏览器 缩放为80% 时,margin值才正确

    声明:小白的笔记,欢迎大神指点.联系QQ:1522025433. 在网页布局中,通过 谷歌浏览器或火狐浏览器 预览时,发现我们定义的盒模型width,height,margin,padding 值都是 ...

  7. dagger2 重点笔记

    官方架构例子,里面有个dagger2的结合的例子 https://github.com/googlesamples/android-architecture https://google.github ...

  8. QT中的线程与事件循环理解(1)

    1.需要使用多线程管理的例子 一个进程可以有一个或更多线程同时运行.线程可以看做是“轻量级进程”,进程完全由操作系统管理,线程即可以由操作系统管理,也可以由应用程序管理.Qt 使用QThread 来管 ...

  9. mysql的mysqli异步与php的携程

    <?php $begin = time(); //同步请求 function multi_sync(){ $host = '192.168.2.87'; $user = 'census'; $p ...

  10. [LeetCode] 437. Path Sum III_ Easy tag: DFS

    You are given a binary tree in which each node contains an integer value. Find the number of paths t ...