跳到主要内容

2 篇博文 含有标签「git」

查看所有标签

大文件历史删除

如果你的 Git 提交历史中有大的包(例如大文件)需要删除,比如说你的包中有一个大视频之前被上传过,你可以使用以下方法:

git filter-repo

使用 git filter-repo(推荐)git filter-repo 是一个更现代的工具,可以有效地清理历史。首先,确保安装了这个工具:pip install git-filter-repo

然后,运行以下命令来删除历史中的大文件:git filter-repo --strip-blobs-bigger-than 10M

这个命令会删除历史中大于 10MB 的文件。你可以根据需要调整大小限制。

注意:git filter-repo 是用 Python 编写的工具,因此需要安装 Python

git filter-branch

使用 git filter-branch(较旧的方法): 如果你无法使用 git filter-repo,可以使用 git filter-branch

git filter-branch --index-filter 'git rm --cached --ignore-unmatch path/to/large-file' --prune-empty --tag-name-filter cat -- --all

替换 path/to/large-file 为你想删除的文件路径。

  • git filter-branch:用于重写 Git 历史的命令。
  • --index-filter 'git rm --cached --ignore-unmatch path/to/large-file':这是一个索引过滤器,用于在每个提交中从索引中删除指定的文件(在这里是 path/to/large-file)。--cached 表示仅从索引中删除,而不从工作区删除;--ignore-unmatch 表示如果文件在某些提交中不存在,也不会导致错误。
  • --prune-empty:在删除文件后,如果某个提交没有其他内容(变成空提交),则将其删除。
  • --tag-name-filter cat:在重写历史时,保留标签的名称。
  • -- --all:表示对所有分支和标签进行操作。

当你的文件内容过于复杂,(笔者的情况就是,我的个人博客有很多的图片,但是之前上传图片没有压缩,所以导致.git 文件很大,我选择直接重置.git 提交历史)

当然你得确定你以后不需要回溯历史信息

直接删除 Git 历史

假设当前的分支为main

  1. 备份当前分支(可选): 如果你想保留当前状态,可以创建一个新的分支:git checkout -b dev

  2. 重置当前分支: 使用 --orphan 创建一个新的分支,该分支没有任何历史:git checkout --orphan develop

  3. 添加文件并提交: 将当前工作区的文件添加到新的分支并提交:git add . git commit -m "Initial commit without history"

  4. 删除旧分支git branch -D main

  5. 将新的分支重命名为旧分支的名称git branch -m main

  6. 强制推送到远程git push origin main --force

  7. 未清理未引用的对象:在删除历史后,Git 可能仍然保留了一些未引用的对象。你可以通过以下命令来清理它们:

    1. git reflog expire --expire=now --all

      • git reflog:用于查看和管理 Git 的引用日志(reflog),记录了所有的引用变更(例如,分支的移动)。
      • expire:这个子命令用于过期处理,将不再使用的引用标记为过期。
      • --expire=now:指定所有引用立即过期,意味着将所有未引用的对象标记为可以删除。
      • --all:作用于所有的引用,包括所有分支和标签。
    2. git gc --prune=now --aggressive

      • git gc:执行垃圾回收,清理未引用的对象,并优化 Git 存储
      • --prune=now:指示 Git 删除所有未引用的对象,而不保留任何过期对象。now 的意思是立即删除
      • --aggressive:执行更深入的优化,可能会耗费更多时间,但能更有效地减少 .git 文件夹的大小。
  8. 最后强制推到远程即可git push origin main --force

这样你的git提交纪录就变成首次了,.git也被清除缩小了


鲸落知识点git阅读需 4 分钟

commit message = subject + :+ 空格 + message 主体

例如: git commit -m "feat:增加用户注册功能"

常见的 subject 种类以及含义如下:

  1. feat: 新功能(feature)
    • 用于提交新功能
    • 例如:feat: 增加用户注册功能
  2. fix: 修复 bug
    • 用于提交 bug 修复
    • 例如:fix: 修复登录页面崩溃的问题
  3. docs: 文档变更
    • 用于提交仅文档相关的修改
    • 例如:docs: 更新README文件
  4. style: 代码风格变动(不影响代码逻辑)
    • 用于提交仅格式化、标点符号、空白等不影响代码运行的变更
    • 例如:style: 删除多余的空行
  5. refactor: 代码重构(既不是新增功能也不是修复bug的代码更改)
    • 用于提交代码重构
    • 例如:refactor: 重构用户验证逻辑
  6. perf: 性能优化
    • 用于提交提升性能的代码修改
    • 例如:perf: 优化图片加载速度
  7. test: 添加或修改测试
    • 用于提交测试相关的内容
    • 例如:test: 增加用户模块的单元测试
  8. chore: 杂项(构建过程或辅助工具的变动)
    • 用于提交构建过程、辅助工具等相关的内容修改
    • 例如:chore: 更新依赖库
  9. build: 构建系统或外部依赖项的变更
    • 用于提交影响构建系统的更改
    • 例如:build: 升级webpack到版本5
  10. ci: 持续集成配置的变更
    • 用于提交CI配置文件和脚本的修改
    • 例如:ci: 修改GitHub Actions配置文件
  11. revert: 回滚
    • 用于提交回滚之前的提交
    • 例如:revert: 回滚feat: 增加用户注册功能

鲸落知识点Git阅读需 2 分钟