BFG Repo-Cleaner 清理在Git历史记录中不需要的数据(git仓库臃肿、git仓库太大、清理git仓库大文件、清理.git\objects\pack中的.pack文件)

BFG Repo-Cleaner: 在Git历史记录中清理不需要的数据

在处理 Git 项目时,可能会遇到一些敏感信息或者大文件被误上传到了仓库,这样会导致仓库变得庞大并且难以管理。这种情况下,BFG Repo-Cleaner 就派上用场了。它是一个更简单、更快速的工具,可以帮助我们从 Git 历史记录中删除不需要的数据。

BFG Repo-Cleaner 是什么?

BFG Repo-Cleaner 是一个由 Scala 编写的命令行工具,用于快速、精确地从 Git 仓库中删除不需要的数据。相比于 git-filter-branch 命令,BFG 的速度更快,使用也更简单。无论是大文件还是敏感数据,只需简单的命令,就能将其从所有提交历史中移除。

安装 BFG Repo-Cleaner

首先,需要在系统上安装 BFG Repo-Cleaner。以下是在 macOS 和 Ubuntu 以及 Windows 系统上的安装方法:

在 macOS 上安装

brew install bfg

在 Ubuntu 上安装

sudo apt-get install bfg-repo-cleaner

在 Windows 上安装

页可以在Windows上安装BFG Repo-Cleaner,但是需要先安装Java Runtime Environment (JRE),因为BFG Repo-Cleaner是用Scala写的,需要运行在JRE上。这里是具体步骤:

1. 安装Java Runtime Environment

可以从Oracle的官方网站下载最新版本的JRE:https://www.oracle.com/java/technologies/javase-jre8-downloads.html
在这里插入图片描述
需要注册oracle账号,有点麻烦,我的密码填的Qin********123#

这里有我的下载链接:https://download.csdn.net/download/Dontla/88617066

然后双击jdk-8u391-windows-x64.exe默认安装即可。

3. 确保计算机上已经安装了git

如果还没有安装,你可以从这里下载并安装:https://git-scm.com/download/win

4. 下载BFG Repo-Cleaner的jar文件

你可以从它的GitHub页面找到下载链接:https://github.com/rtyley/bfg-repo-cleaner

在这个地方下载jar:https://rtyley.github.io/bfg-repo-cleaner/

在这里插入图片描述

这里有我的下载链接:https://download.csdn.net/download/Dontla/88617154

5. 运行BFG Repo-Cleaner

打开命令提示符(cmd)或者PowerShell,然后使用以下命令运行BFG Repo-Cleaner:

java -jar bfg.jar

在这里插入图片描述

注意你需要把bfg.jar替换成你下载的jar文件的实际路径。

通过以上步骤,你就可以在Windows上运行BFG Repo-Cleaner了。

注意,如果要停止BFG Repo-Cleaner,关掉控制台窗口即可。

清理 Git 历史记录

使用 BFG Repo-Cleaner 可以轻松地从 Git 历史记录中清理不需要的数据。下面是一些常见的清理操作。

删除大文件

Git 对大文件的处理效率并不高,因此,在仓库中保存大量大文件可能会影响其性能。以下是使用 BFG Repo-Cleaner 删除大文件的步骤:

  1. 克隆一个裸仓库:

    git clone --mirror https://github.com/username/repo.git
    
  2. 使用 BFG 删除大于 100M 的文件:

    bfg --strip-blobs-bigger-than 100M repo.git
    

    注意,直接运行 bfg 这个命令在 Windows 上并不会工作,命令需要连起来使用,如:

    java -jar bfg-1.14.0.jar --strip-blobs-bigger-than 100M kyai_3.0_tml.git
    
    E:\20230228_HuiYuanKuangNaoCwProject\testKYAI\coding>java -jar bfg-1.14.0.jar --strip-blobs-bigger-than 100M kyai_3.0_tml.git
    
    Using repo : E:\20230228_HuiYuanKuangNaoCwProject\testKYAI\coding\kyai_3.0_tml.git
    
    Scanning packfile for large blobs: 24977
    Scanning packfile for large blobs completed in 4,265 ms.
    Found 41 blob ids for large blobs - biggest=1680050705 smallest=118199808
    Total size (unpacked)=15999116602
    Found 14691 objects to protect
    Found 3 commit-pointing refs : HEAD, refs/heads/kyai_tml_dev, refs/heads/master
    
    Protected commits
    -----------------
    
    These are your protected commits, and so their contents will NOT be altered:
    
     * commit aa9fcf63 (protected by 'HEAD') - contains 4 dirty files :
            - kyai_one_button_deploy/shsany_ai/kyai_arm_ubuntu/kyai/ky/client/web/html/web/expressServer/public/upload/box_cjg_people_2.9.tgz (135.4 MB)
            - kyai_one_button_deploy/shsany_ai/kyai_x86_ubuntu/kyai_x86_ubuntu_20231113-163359.tgz (1.6 GB)
            - ...
    
    WARNING: The dirty content above may be removed from other commits, but as
    the *protected* commits still use it, it will STILL exist in your repository.
    
    Details of protected dirty content have been recorded here :
    
    E:\20230228_HuiYuanKuangNaoCwProject\testKYAI\coding\kyai_3.0_tml.git.bfg-report\2023-12-11\16-05-11\protected-dirt\
    
    If you *really* want this content gone, make a manual commit that removes it,
    and then run the BFG on a fresh copy of your repo.
    
    
    Cleaning
    --------
    
    Found 742 commits
    Cleaning commits:       100% (742/742)
    Cleaning commits completed in 1,919 ms.
    
    Updating 2 Refs
    ---------------
    
            Ref                       Before     After
            ---------------------------------------------
            refs/heads/kyai_tml_dev | f4659531 | 0d17b95a
            refs/heads/master       | aa9fcf63 | c44db569
    
    Updating references:    100% (2/2)
    ...Ref update completed in 12 ms.
    
    Commit Tree-Dirt History
    ------------------------
    
            Earliest                                              Latest
            |                                                          |
            ...DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
    
            D = dirty commits (file tree fixed)
            m = modified commits (commit message or parents changed)
            . = clean commits (no changes to file tree)
    
                                    Before     After
            -------------------------------------------
            First modified commit | a1520b5a | 186e5d0a
            Last dirty commit     | 67d311f2 | 2ea2144f
    
    Deleted files
    -------------
    
            Filename                                           Git id
            ------------------------------------------------------------------------------------------------
            box_cjg_people_2.9.tgz                           | 04960a9c (135.4 MB)
            kyai_chrislusf_seaweedfs_x86-v1.0.0_20230508.tar | bf7a1441 (116.4 MB)
            kyai_fauria_vsftpd_arm-v1.0.0_20230628.tar       | 348db2e3 (389.1 MB)
            kyai_fauria_vsftpd_x86-v1.0.0_20230504.tar       | 70a54bc7 (389.1 MB)
            kyai_kykj_arm-v1.0.0_20230628.tar                | 3271d85e (507.3 MB)
            kyai_kykj_x86-v1.0.0_20230724.tar                | 16020abb (513.0 MB)
            kyai_mysql_arm-v8.0_20230628.tar                 | 929b052d (573.9 MB)
            kyai_mysql_x86-v8.0_20230724.tar                 | f52a861d (552.7 MB)
            kyai_nginx_arm-v1.18_20230627.tar                | b5b6653d (123.8 MB)
            kyai_nginx_x86-v1.18_20230724.tar                | 0f266b2a (130.8 MB)
            kyai_rest-latest.tar                             | fbe6f9ae (390.9 MB)
            kyai_rest-v1.0.0_20230326.tar                    | d46e4290 (390.9 MB)
            kyai_rest_arm-v1.0.0_20230624.tar                | 0d0c8f14 (429.7 MB)
            kyai_rest_x86-v1.0.0_20230724.tar                | ab47c3c6 (401.5 MB)
            kyai_seaweedfs_arm-v1.0.0_20230629.tar           | 1538fe00 (112.7 MB)
            ...
    
    
    In total, 1872 object ids were changed. Full details are logged here:
    
            E:\20230228_HuiYuanKuangNaoCwProject\testKYAI\coding\kyai_3.0_tml.git.bfg-report\2023-12-11\16-05-11
    
    BFG run is complete! When ready, run: git reflog expire --expire=now --all && git gc --prune=now --aggressive
    
    E:\20230228_HuiYuanKuangNaoCwProject\testKYAI\coding>
    
  3. 清理 Git 数据并推送:

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

以上命令将会删除所有大于 100M 的文件,并将改动推送到远程仓库。

注意要进入项目目录执行:

E:\20230228_HuiYuanKuangNaoCwProject\testKYAI\coding\kyai_3.0_tml.git>git reflog expire --expire=now --all && git gc --prune=now --aggressive
Enumerating objects: 24994, done.
Counting objects: 100% (24994/24994), done.
Delta compression using up to 16 threads
Compressing objects: 100% (23735/23735), done.
Writing objects: 100% (24994/24994), done.
Selecting bitmap commits: 732, done.
Building bitmaps: 100% (112/112), done.
Total 24994 (delta 12924), reused 10848 (delta 0), pack-reused 0
Removing duplicate objects: 100% (256/256), done.

E:\20230228_HuiYuanKuangNaoCwProject\testKYAI\coding\kyai_3.0_tml.git>

但是执行git push的时候失败了,不知道为啥。。。

在这里插入图片描述
这个错误提示通常表示在尝试向远程仓库推送数据时,网络连接中断或不稳定。这可能是由于几个原因导致的:

  1. 文件过大:如果你正在尝试上传的文件大小超过了GitHub对单个文件的限制(通常为100MB),则可能会出现此问题。

  2. 网络问题:你的网络连接可能不稳定,或者你的网络服务提供商可能限制了你的上传带宽。

  3. 服务器问题:目标服务器可能存在问题,无法接收更多的数据。

有几种可能的解决方案:

  1. 检查你的网络连接,并确保你的网络服务提供商没有限制你的上传速度。

  2. 如果你正在尝试上传的文件非常大,你可能需要将其分割成较小的部分,或者尝试使用Git LFS(Large File Storage)。

  3. 你可以尝试更改 Git 的缓冲区大小。打开命令行输入以下命令:git config --global http.postBuffer 524288000。这会将缓冲区大小设置为500MB,可能有助于解决问题。

  4. 最后,如果以上方法都不能解决问题,你可能需要联系你的服务器提供商,看看是否他们的服务器有任何问题。

后来又成功了。。。。

在这里插入图片描述

清理敏感数据

当在公开的 Git 仓库中误上传了密码、API 密钥或其他敏感信息时,可以使用 BFG Repo-Cleaner 来快速清理。以下是操作步骤:

  1. 克隆一个裸仓库:

    git clone --mirror https://github.com/username/repo.git
    
  2. 创建一个文本文件(例如 passwords.txt),在其中列出需要删除的敏感词:

    password123
    API_KEY_ABCD1234
    
  3. 使用 BFG 删除敏感词:

    bfg --replace-text passwords.txt repo.git
    
  4. 清理 Git 数据并推送:

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

以上命令将会删除所有包含 passwords.txt 文件中列出的敏感词的提交,并将改动推送到远程仓库。

结论

BFG Repo-Cleaner 是一个非常有用的工具,可以帮助开发者在 Git 项目中清理不需要的数据。相比于其他工具,如 git-filter-branch,BFG 更简单、更快速。因此,无论是清理大文件还是敏感数据,BFG 都是一个值得尝试的工具。

猜你喜欢

转载自blog.csdn.net/Dontla/article/details/134925961