折叠 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 存储库的历史记录 的相关文章

  • 签出现有的远程分支

    我见过不同的方法来检查现有的远程分支 假设我的朋友推送了新分支 bigbug 并且我想签出并将我的本地工作副本切换到该分支 我有以下选项 1 git checkout b bigbug origin bigbug 2 git checkou
  • 我可以从命令行向 github 添加问题吗?

    我是 git 新手 我希望能够通过 github 绘制我的项目的计划和进度 问题是 这需要在 github com 上使用浏览器进行大量点击 并且我希望能够通过使用命令行程序来自动执行该任务 github 有命令行界面吗 有一个ghi ge
  • 在 Windows 上将 Mercurial (hg) 存储库转换为 Git (7)

    我现在真的很沮丧 我有一个现有的 hg 存储库 其中有几个月的编码历史 我想将其放入私有 Github 存储库中 以便我可以从那里对其进行处理 不幸的是我使用的是 Windows 我似乎找不到any转换我实际上可以正常工作的存储库的方法 实
  • 在 git 提交消息中使用任何 utf-8 字符是否安全?

    我发现使用 UTF8 字符 例如 很有用 请参阅here http www utf8icons com subsets dingbats 在提交消息中 重构 NewService 添加了更好的服务 OldServiceA 据我所见 它see
  • 将 svn 存储库添加到现有的 git 存储库中?

    我知道你可以使用 git svn init 来跟踪 svn 存储库 但这是为了你想创建一个全新的存储库 我的情况是 我目前已经有一个现有的 git 存储库 并且希望通过将 svn 存储库设为我当前 git 存储库中的远程分支来跟踪 svn
  • 如何使用 git hook pre-merge-commit 获取原始合并分支名称

    我正在尝试使用新的 git hook pre merge commit 创建一个特定的脚本 但它没有参数 有什么解决方法可以让我获得正在合并的分支的名称吗 例子 在分支 myBranch 上 我调用 git merge testingBra
  • Python 无法在 git bash 命令行中工作

    Python 不会在 git bash Windows 中运行 当我在命令行中输入 python 时 它会将我带到一个空行 而不会像在 Powershell 中一样显示它已输入 python 2 7 10 它没有给我错误消息 但 pytho
  • 使用 Subversion 进行部分提交

    鉴于我做的案例两个独立的变化 in one文件 例如 添加了一个新方法并更改了另一个方法 我经常不想提交这两项更改 因为one提交 但作为two独立承诺 在 git 存储库上我会使用互动模式 of git 添加 1 http linux d
  • 本地git,推送到tfs远程repo

    我厌倦了向我的队友解释使用 DVCS 相对于 CVCS 的好处 他们中的一些人害怕学习曲线 另一些人则看不出任何原因 因为对他们来说 这都是一样的 就我个人而言 我对 TFS 及其问题感到非常厌倦 每当我需要进行一些小的 修复 时 我都必须
  • 为什么在 Eclipse 中对 Egit 管理的项目禁用合并工具?

    根据Egit 用户指南 http wiki eclipse org EGit User Guide Using Merge Tool 要使用合并工具 应右键单击存在合并冲突的资源 然后选择Team gt 合并工具 但是 当我执行此操作时 合
  • 如何标记单个文件?或如何下载特定文件? - 胃肠道

    我想向文件添加标签以轻松下载该文件而不是整个分支 如何下载GIT中的特定文件 我不知道有什么方法可以标记特定文件git 对于第二个问题 如何下载特定文件git 仅当您的意思是 同时下载 时 以下内容才有效in a git存储库 这就是我理解
  • 如何使用 sourceTree 进行推送?

    我正在使用 sourceTree 管理 Unity 项目 版本 4 6 3 我只是想返回到上一次提交 右键选择 将当前分支重置到此提交 在使用模式中选择 硬 然后放回上一次提交 之后 我尝试去推 但没有成功 抱歉 当时我忘记了错误 之后 我
  • 如何将普通的 Git 存储库转换为裸存储库?

    如何将 普通 Git 存储库转换为裸存储库 主要区别似乎是 在普通的 Git 存储库中 你有一个 git存储库内的文件夹 包含构成工作副本的所有相关数据和所有其他文件 在裸露的 Git 存储库中 没有工作副本和文件夹 我们称之为repo g
  • 返回到存储库中的特定修订后提交并推送更改?

    我们需要及时返回到某个特定的提交 一些意外的改变是为了掌握 尝试恢复它挖得太深 所以 master 的状态很糟糕 现在我们希望master回到66ada4cc61d62afc 根据git 恢复到某个提交 https stackoverflo
  • 如何通过哈希显示提交的日期和时间

    I used git reflog识别我创建特定分支时的哈希值 我得到了哈希值fe1ddcdef 我还没有将此分支推送到远程 我现在正在尝试查找日期和时间fe1ddcdef发生 git reflog只告诉我 fe1ddcdef HEAD 1
  • 如何使用 vim 作为“git show”编辑器?

    全部如所述如何使用 vim 作为 git log 编辑器 https stackoverflow com questions 16666009 how do i use vim as git log editor不适用于 git show
  • git stash 删除最旧的存储(比如最旧的 5 个存储)

    如何在一个语句中删除最旧的存储 例如最旧的 5 个存储 而不是执行以下操作 git stash drop stash 3 git stash drop stash 4 git stash drop stash 5 git stash dro
  • Visual Studio Code 内置故事,用于查看 git 提交历史记录并对其内容进行比较

    In this https stackoverflow com questions 37899765 how can i view the git history in visual studio code 60013101 noredir
  • 在 Web 应用程序中显示最新的提交值?

    我有一些 Rails 应用程序 我使用 Git 作为版本控制系统 我使用 GitHub 或 Beanstalk 作为存储库主机 从理论上讲 我想要做的事情非常简单 以某种方式在 Web 应用程序的页脚中显示最新的提交 ID 号 哈希值 这样
  • Git:压缩 master 上提交的最简单方法[重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 git 将最后 X 次提交压缩在一起 https stackoverflow com questions 5189560 how can i squash my last x commits

随机推荐

  • 比较 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 我们想