折叠 git 存储库的历史记录

2023-12-09

我们有一个有着悠久历史的 git 项目。

具体来说,在项目早期,项目中有相当多的二进制资源文件,这些文件现在已被删除,因为它们实际上是外部资源。

然而,由于之前已提交这些文件,我们的存储库的大小>200MB(当前总签出约为20MB)。

我们想要做的是“折叠”历史记录,以便存储库看起来是根据比实际版本更新的版本创建的。例如

1-----2-----3-----4-----+---+---+
                   \       /
                    +-----+---+---+
  1. 存储库已创建
  2. 添加了大量二进制文件
  3. 删除了大量二进制文件
  4. 存储库的新预期“开始”

因此,我们实际上希望在某个点之前丢失项目历史记录。此时只有一个分支,因此尝试处理多个起点等并不复杂。但是,我们不想丢失所有历史记录并使用当前版本启动一个新存储库。

这是可能的吗,还是我们注定永远拥有一个臃肿的存储库?


您可以删除二进制膨胀并保留其余的历史记录。 Git 允许您重新排序和“压缩”先前的提交,因此您可以仅合并添加和删除大型二进制文件的提交。如果添加全部在一次提交中完成,删除则在另一次提交中完成,这将比处理每个文件容易得多。

$ git log --stat       # list all commits and commit messages 

在此搜索添加和删除二进制文件的提交并记下它们的 SHA1,例如2bcdef and 3cdef3.

然后要编辑存储库的历史记录,请使用rebase -i命令及其交互选项,从添加二进制文件的提交的父级开始。它将启动您的 $EDITOR,您将看到以以下内容开头的提交列表2bcdef:

$ git rebase -i 2bcdef^    # generate a pick list of all commits starting with 2bcdef
# Rebasing zzzzzz onto yyyyyyy 
# 
# Commands: 
#  pick = use commit 
#  edit = use commit, but stop for amending 
#  squash = use commit, but meld into previous commit 
# 
# If you remove a line here THAT COMMIT WILL BE LOST.
#
pick 2bcdef   Add binary files and other edits
pick xxxxxx   Another change
  .
  .
pick 3cdef3   Remove binary files; link to them as external resources
  .
  .

Insert squash 3cdef3作为第二行并删除上面写着的行pick 3cdef3从列表中。您现在拥有了交互式操作的列表rebase它将把添加和删除二进制文件的提交合并到一个提交中,其差异只是这些提交中的任何其他更改。然后,当您告诉它完成时,它将按顺序重新应用所有后续提交:

$ git rebase --continue

这将需要一两分钟。
您现在拥有一个不再有二进制文件来来去去的存储库。但它们仍然会占用空间,因为默认情况下,Git 会将更改保留 30 天,然后才能进行垃圾收集,以便您可以改变主意。 如果您现在想删除它们:

$ git reflog expire --expire=1.minute refs/heads/master
      #all deletions up to 1 minute  ago available to be garbage-collected
$ git fsck --unreachable      # lists all the blobs(files) that will be garbage-collected
$ git prune
$ git gc                      

现在您已经消除了臃肿,但保留了其余的历史记录。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

折叠 git 存储库的历史记录 的相关文章

  • Git - 如何将整个目录恢复到特定提交(删除任何添加的文件)

    我想恢复 git 中的目录 恢复其中的所有文件 并删除自该提交以来添加的所有文件 进行结账似乎只能满足我的第一个要求 但不会删除任何文件 我想出了最简单的解决方案 git rm path to dir git checkout
  • git 排除与忽略

    I use Tower http www git tower com 用于在 Mac 中使用 Git Tower 中的设置具有创建 gitignore 的 忽略 部分 但它还有另一个名为 排除 的部分 似乎可以将排除与 git ls fil
  • 无法通过 Git Bash 克隆 git 存储库

    在尝试使用克隆存储库时git clone 它显示以下错误 致命 无法访问 https github com microsoft c9 python getting started git https github com microsoft
  • 使当前提交成为 Git 存储库中唯一(初始)提交?

    我目前有一个本地 Git 存储库 我将其推送到 Github 存储库 本地存储库有约 10 次提交 Github 存储库是其同步副本 我想要做的是从本地 Git 存储库中删除所有版本历史记录 以便存储库的当前内容显示为唯一提交 因此存储库中
  • 如何减少 Bitbucket 上的 git repo 大小?

    我的问题摘要 在我向两个现有文件添加了几百个字节后 我在 Bitbucket 上的一个私人存储库的大小突然增加了一倍多 该存储库现在超过 2GB 这导致 Bitbucket 将其置于只读模式 因为它处于只读模式 所以我无法推送会减少存储库大
  • 将更改从一个分支复制到另一个分支

    我有一个分支名为BranchA from master 我有一些改变BranchA 我不会合并来自BranchA to master 现在我创建了另一个分支master named BranchB 我如何复制更改BranchA to Bra
  • 使用 gitignore 嵌套存储库。

    我想嵌套 2 个 git 存储库 我一直在阅读子模块 有一段时间我认为它很棒 我想我可能想要其他东西 这是我的情况 首先 我想我应该提到我的所有服务器都托管网站 并以 staging domain com 和 domain com 实时 模
  • Git 的企业采用率?

    最近一些同事之间进行了一场讨论 在当今的软件行业中 如何存在两个不同的世界 面向自由软件 公司的 Question Git 在企业环境中的使用情况如何 您在企业环境中使用 Git 的体验如何 无论如何 我们在工作场所使用 git 每个人都对
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • VSTS:在构建过期的情况下自动变基/合并和重新排队构建验证门

    我们最近对 PR 上的构建验证门进行了更改 这样 如果另一个提交在当前 PR 完成之前进入主分支 则构建会 立即 过期 看here https stackoverflow com questions 49418800 vsts invali
  • Git 工作流程:分叉项目并维护本地修改副本,但保持最新

    我正在尝试找出最佳工作流程 用于维护具有自定义功能的 github 托管项目 moodle 的本地副本 同时保持保持副本最新的能力 告诉我我正在考虑做的事情是否完全疯狂 分叉项目 github com moodle moodle gt gi
  • GIT:提交时“致命:无法写入 new_index 文件”

    当我尝试将更改提交到本地存储库时 我收到以下消息 致命 无法写入 new index 文件 As this 线程说明 http luhman org blog 2010 04 05 git fatal unable write newind
  • 如何创建名称中带有正斜杠的标签

    当我已经有了类似的标签时 有什么方法可以创建名称中带有正斜杠的 git 标签吗 假设我有 1 16 0 标签 并且我想创建 1 16 0 1 0 0 标签 git tag 1 16 0 1 0 0 error refs tags 1 16
  • 为 RHEL 6 安装/构建 git-svn

    我无权访问 RHEL6 存储库 那么在 RedHat Enterprise Linux 6 上构建和 或安装 git svn 工具的最佳方法是什么 通过卸载现有的 yum擦除git 并从源安装最新的来设法安装git和git svn 1 7
  • 在我的例子中,GIT 添加恢复(保留更改)

    在我对文件进行更改之后 我用git add FILE NAME 然后 我想将其恢复为未添加但与此同时保留更改 这个怎么做 git reset FILE NAME会做的 See the git reset manual https git s
  • Git:如何正确合并两个功能完全不同的分支?

    想象一下这样一种情况 同一个项目有两个分支 第一个分支的一部分对另一个分支进行了大幅重构 但有一段时间 您需要保持两个分支的功能 因此您需要对两个分支进行错误修复和关键功能添加 有时是以不对称的方式 在某些时候 您必须将重构的分支合并到原始
  • 哪些 git hooks 适用于“git rebase --continue”?

    我正在尝试为我的组织构建一组 git hook 脚本 我想使用的一个脚本 仅用于我自己的多个项目 将是检查git rebase continue我的代码中没有留下任何冲突标记 lt lt lt lt lt or gt gt gt gt gt
  • 有没有办法导入/导出容器绑定脚本

    我有一个插件 它使用 appscripts gs 以及 html js 和 css 文件 目前我们所做的是我们有一个参考 Google 文档 其中有一个脚本项目包含所有这些源代码 但是除了手动复制和粘贴之外 没有办法在 GIT 中保留源代码
  • 在推送后检索孤立的提交对象 --force

    Doing push force总是有点冒险 这里有一个例子 说明它如何产生一些问题 例如远程丢失修订版本 假设 有一个人Bob已更新远程master分支来自B to C 还有另外一个人Mike还没有获取此更新并且HEAD of his m
  • 如何在 Visual Studio 2013 中使用 Git 的外部 diff 工具?

    我找到了这个帖子 http architects dzone com articles how configure diff and merge这解释了如何让 Visual Studio 2013 在比较 Git 中的文件时使用内置 dif

随机推荐

  • 比较 uint64_t 和 float 的数值等效性

    我正在编写一个协议 它使用RFC 7049作为其二进制表示 该标准规定 如果数字值等于相应的 64 位数字 则协议可以使用数字的 32 位浮点表示 转换不得导致精度损失 哪些 32 位浮点数可以大于 64 位整数并且在数值上与它们等价 正在
  • 卸载矩阵并释放内存

    我可以从文本文件加载矩阵 load mydata txt 问题是我的矩阵文件大约有 250Mb 经过几次这样的加载后 我没有内存来处理下一个文件 如何卸载它并释放资源以供进一步使用 Use clear or 清除变量 默认情况下 MATLA
  • 使用 libre office 创建的 Acrofield 不可填写代码,除非我编辑 pdf 一次

    我正在 Libre Office 中创建表单控件并将文档导出为 pdf 尝试使用 itextsharp 即 C 程序 设置控件 文本框 的文本只会清空该框 但是 如果我使用 acrobat reader 打开 pdf 并编辑框中的文本 则将
  • 将 C# 代码组织到不同的文件中

    我的主代码文件已经达到了大约一千行长并且变得难以管理 也就是说 我开始感到困惑 不知道在哪里可以找到一些东西 评论很好 但是东西太多了 我真的希望能够将我的代码组织到不同的文件中 每个文件都有自己的用途 当我编辑这些其他文件时 我希望在输入
  • 带有图像和标签的 Python GTK3 按钮

    我试图获取带有图像和标签的按钮 但没有成功 我可以有带有标签或图像的按钮 但不能两者兼而有之 这是我的代码部分 try pb Pixbuf new from file at size myimg jpg 100 100 except pb
  • 想了解为什么 switch_to_alert() 收到删除线以及如何修复

    我试图 接受 一个简单的模态警报 只有 确定 按钮的屏幕弹出窗口 但 driver switch to alert 中的 switch to alert 正在接收删除线 在 pycharm 上 我正在使用 OpenPyxl 的数据驱动测试脚
  • swig 没有匹配的重载函数

    我在使用 SWIG 将 C 代码包装在 PHP 中时遇到问题 我有一个 C 类 其方法声明如下 int hexDump string dmpstr bool space true const 我还将 std string i 包含在我的接口
  • 使用 LINQ 在 C# 中合并字典

    我有三本字典 比如 Dictionary
  • CoreData 中 NSDictionary 属性的更新未保存

    我在 CoreData 中创建了一个实体 其中包含作为 NSDictionary 实现的 Transformable 属性类型 NSDictionary 属性仅包含自定义类的值 自定义类的属性都是NSString类型 自定义类符合 NSCo
  • 将 JSON 对象反序列化为嵌套 C# 对象

    Edit 我想我应该提到我无法控制 JSON 并且我知道通常我的 C 对象应该与 JSON 匹配 我的问题不是 为什么这不反序列化 我知道为什么不是 我问是否有一种方法可以按照我要求的方式反序列化 JSON 我正在使用 Newtonsoft
  • 将 for 循环转换为向量(向量化)

    对于那些超级专家 我想知道您是否看到一种快速方法将以下 for 循环转换为更有效的单行向量计算 Define A size n 1 B size n m C size n 1 B 2 200 3 300 4 400 C 1 2 1 for
  • 以下用于添加到内存引用的字节说明符在 NASM 汇编器中起什么作用?

    下面的代码 section data Snippet db KANGAROO section text global start start mov ebx Snippet add byte ebx 32 将 BX 中的内存地址所指的数字加
  • Swift 字符串文字赋值给 C 变量

    在 Swift 中 当调用 C 函数时 Swift 字符串作为参数传递时会自动强制转换为 CString 但是 在填写 C 结构体或全局变量时 我没有得到相同的行为 strlen swiftString Works CGlobalStruc
  • Asp.net mvc 多对多关系视图

    大家好 我创建了几个实现多对多关系的模型 现在我在正确格式化 设计 创建和编辑 视图时遇到问题 这是我的模型 学生模型 namespace HMS Models Table Students Schema Admission public
  • 使用 Cognito 用户池,而不使用 Cognito 联合身份(身份池)

    我只想使用 Cognito 用户池 因此我想将身份联合与 Cognito 用户池一起使用 而不使用 Cognito 联合身份 身份池 我已按照文档进行操作 但无法成功 http docs aws amazon com cognito lat
  • 如何使用 canvas 和 Kinetic.js 裁剪图像

    我的函数绘制一个图像 并使用 Kinetic js 在另一层上绘制另一个图像 但我想裁剪名为 smsTopBg image 的第二个图像 window onload function INITIALISATION var stage new
  • Android Google Drive API 异常:403 禁止

    我正在开发一个可以访问 Google Drive 上用户的 appdata 文件夹的应用程序 当我处于调试模式时 该应用程序运行良好 当我发布应用程序并尝试连接到 Google Drive 时 在选择要连接的帐户后 它会出现此错误 com
  • 如何从TSQL调用Web服务? (SQL 服务器 2000)

    我想从 SQL Server 2000 中的 TSQL 调用 Web 服务 我尝试使用以下代码 Declare Object as Int Declare ResponseText as Varchar 8000 Exec sp OACre
  • 在 Javascript 中打印 div 标签的内容而不使用弹出窗口

    我正在努力打印 div 标签的内容而不弹出窗口 我的代码现在看起来像这样 var DocumentContainer document getElementById print var WindowObject window open Co
  • 折叠 git 存储库的历史记录

    我们有一个有着悠久历史的 git 项目 具体来说 在项目早期 项目中有相当多的二进制资源文件 这些文件现在已被删除 因为它们实际上是外部资源 然而 由于之前已提交这些文件 我们的存储库的大小 gt 200MB 当前总签出约为20MB 我们想