如何从 git 历史记录中删除除最后 n 次提交之外的所有提交以节省空间

2024-04-05

我使用 git 来备份和恢复系统上可能发生更改的文件夹,并且随着无用的历史记录的积累,它们可能会变得非常大。我只需要最后 4 次左右的提交,如何压缩或删除除最后 n 次提交之外的整个历史记录?


免责声明:不幸的是,您的第一句话可能玷污了这个问题:

我使用 git 来备份和恢复系统上可能发生更改的文件夹,并且随着无用的历史记录的积累,它们可能会变得非常大。

如果历史记录“无用”,那么 Git 可能不是正确的工具。正如评论中提到的,Git 通常不是备份系统的正确工具。话虽这么说,如果您的问题不包括第一句话,我们将无法判断您“为什么”希望这样做,而您剩下的问题当然是有效的:

我只需要最后 4 次左右的提交,如何压缩或删除除最后 n 次提交之外的整个历史记录?

这是实现此目的的一种相当直接的方法。请注意,此方法要求您在开始之前确定一些事情:

  1. 您要重写的分支名称。 (这个答案假设它被称为main.)
  2. 您分支的根提交。获取它:git log main --reverse(这个答案假设它被称为<old-repo-root-commit-id>.)
  3. 您想要保留的最旧的提交 ID,即从顶部开始的第四个提交,它将成为您新的存储库根提交。 (这个答案假设它被称为<new-repo-root-commit-id>.)
  4. Your git status开始之前应该是干净的。如果不是,请考虑提交(或撤消)您最近的更改。

以下是要运行的命令集:

git switch --detach <new-repo-root-commit-id>
git reset --soft <old-repo-root-commit-id>
git commit --amend --reuse-message=<new-repo-root-commit-id>
git rebase <new-repo-root-commit-id> main --onto @

我看到你的标题提到你的目标是节省空间。为了也实现该目标,您的存储库中不能有任何其他指向旧提交 ID 的引用。如果您的系统中只有一个没有任何标签的分支,那么旧的提交将最终收集垃圾。如果您想立即清理它,请参阅这个问题 https://stackoverflow.com/q/1904860/184546.

命令如何工作的详细解释:

  • The switch命令只是检查您想要成为新根提交的特定提交。这与git checkout <new-repo-root-commit-id>但较新的switch命令要求您指定--detach当您检查提交 ID 而不是命名分支时。
  • The reset命令表示更改当前指向的提交,改为根提交 ID,并且--soft表示不要更改本地文件,并保留所有更改would由于此重置而发生,已分阶段并准备好提交。
  • 请注意,重置后,您将指向存储库中的第一个提交,现在您将修改(重写)该提交以包括根提交和新根提交之间的所有更改。这本质上只是将所有先前的提交压缩为一个提交。这--reuse-message选项表示使用新存储库根目录中的提交消息而不是原始存储库根目录。这实际上是不需要的,但最近的提交消息更有可能比原始提交消息更好。这当然取决于你的提交消息的内容;提交时,如果您愿意,您可以从任何其他提交中设置一条消息,或者也可以创建一个新的不同消息。
  • 在提交命令之后,您只有一次提交,现在您将rebase(重播)剩余的(例如 3)次提交main,“到”你的新提交,只剩下 4 个提交。此时如果您执行 diffmain与提交 IDmain在此过程之前,结果应该是空的,因为您实际上根本没有更改您的工作文件。 (请注意,您可以使用git reflog查看提交 IDmain在您执行此操作之前,只要您尚未对引用日志和旧提交执行完整的垃圾收集,就已开启。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 git 历史记录中删除除最后 n 次提交之外的所有提交以节省空间 的相关文章

  • 警告:您的 git 版本是 1.9.3。存在严重的安全漏洞

    我在部署到 Heroku 期间收到有关 git 1 9 3 严重安全漏洞的警告 我尝试通过 homebrew 更新 git 但发现 git 最初并不是通过 homebrew 安装的 然后我通过自制程序安装了它 brew update bre
  • Gerrit 安装后无法克隆所有项目存储库

    我有一个新设置的 Gerrit 实例 目前只有两个存储库 所有项目 binutils 测试 尝试克隆所有项目时 我收到以下错误 git clone ssh user hostname 29418 All Projects Initializ
  • git在Windows和Linux之间切换后强制刷新索引

    我有一个Windows和Linux共享的磁盘分区 格式 NTFS 它包含一个 git 存储库 约 6 7 GB 如果我只使用Windows or 只使用Linux操作 git 存储库一切正常 但是每次切换系统的时候git status命令将
  • 有没有办法缓存 https 凭据以推送提交?

    我最近转而将我的存储库同步到 GitHub 上的 https 由于防火墙问题 并且每次都要求输入密码 有没有办法缓存凭据 而不是每次都进行身份验证git push 自 Git 1 7 9 2012 年发布 以来 Git 中有一个巧妙的机制可
  • 在 git repo 中查找超过 x MB 且 HEAD 中不存在的文件

    我有一个 Git 存储库 用于存储随机的内容 主要是随机脚本 文本文件 我设计的网站等 随着时间的推移 我删除了一些大型二进制文件 通常为 1 5MB 这些文件会增加存储库的大小 而我在修订历史记录中不需要这些文件 基本上我希望能够做到 m
  • 如何使用 .gitattributes 避免在 git root 中包含文件夹,但在 zip 的 dist 文件夹中包含同名文件夹

    我有一个名为lib在存储库的根目录和另一个名为lib在 dist 文件夹中 我正在尝试使用 gitattributes文件排除除 dist 之外的所有文件夹和文件 以便任何下载为 zip 或 tarball 的人都只会 git 分发文件 我
  • DVCS命令的统一

    当处理多个 开源 项目时 多个版本控制系统开始出现问题 虽然它们共享共同的操作 但我经常在输入时犯错误hg add反而git add 我记得前段时间看到过一个项目 通过提供基本命令以统一的方式访问不同的源代码控制软件提交 ci add等在外
  • 运行“git apply”时出错

    当我尝试时 您能否告诉我如何解决 补丁不适用 错误 git 应用补丁 git apply 0001 my patch error patch failed test xml 114 error text xml patch does not
  • 忽略 git 中的本地配置文件

    Rails 应用程序中有一些本地文件 属于我们存储库的一部分 我希望 git 忽略它们 基本上 我希望 git 忽略我对 config environments 目录和 config application rb 文件中的任何内容所做的所有
  • git diff - 只显示哪些目录发生了变化

    有没有办法只列出已更改的目录 如果我在 git root 的话 project 我更改的文件是 project subtool file1 project subtool file2 project subtool3 file1 我只是想
  • 如何将更改移出主分支

    基本问题 但这一直发生在我身上 进行更改working branch 切换到master git merge working branch git push cap deploy 到舞台 泡一杯新茶 然后我回来思考其他事情并开始做出一些改变
  • 如何正确使用“mvn release:prepare”?

    我尝试了这个命令 用dryrun在我的 Maven 项目上进行测试 mvn release clean release prepare DdryRun true DgenerateBackupPoms false Dtag solocal
  • `git ls-files -s` 输出中不同字段的含义是什么?

    在 Git 中 命令返回的典型结果行git ls files s好像 100755 be2c2e9b0966253096472d4b482c458bc892e493 0 gitignore 这些字段是什么意思 不用再犹豫了git ls fi
  • 自动将所有 GitHub 存储库镜像到 gitlab

    对于 GitLab 必须手动为每个存储库设置拉 推镜像 我想知道那里有any way可以自动将所有 Github 存储库同步到 GitLab 这样 当您在 GitHub 中创建新的存储库时 GitLab 中的存储库将自动创建 并充当拉取镜像
  • Git:发送电子邮件而不提交

    我有一个项目 我做了更改 并想使用 git send email 功能将它们发送给另一个用户 我发现它可以通过发送补丁来工作 由git format patch每次提交 是否可以只发送diff的 我不想先提交 然后发送补丁 是否有gitfo
  • Git - 创建拉取请求而不分叉

    使用 git 已经有一段时间了 关于 git pull request 有很多教程和解释 其动机是什么等等 我遇到两种情况 1 分叉 git 仓库 我查看了一些公共 git 存储库并决定我想要做出贡献 所以我 通过以下方式创建重复的存储库F
  • VS 2015 + Bower:在防火墙后面不起作用

    Problem 在 Visual Studio 2015 中 使用 Bower 我的包在防火墙后面时恢复失败 并出现类似以下内容的错误 ECMDERR 无法执行 git ls remote tags heads git github com
  • 在 Windows 7 上的 Sourcetree 中比较 Word docx 文件

    我一直在尝试获取在 Windows 7 上的 Sourcetree 中工作的 Word docx 文件的文本差异 我已按照此处的说明进行操作将 Microsoft Word 与 git 结合使用 http blog martinfenner
  • 如何将工作树与提交进行比较?

    我在用着 git diff mycommit 用于比较我的工作树mycommit 但它似乎忽略当前索引中不存在的文件 您可以按如下方式重现它 git init echo A gt A txt git add git commit m A g
  • 如何克隆特定的 Git 标签

    From git clone 1 手册页 http git scm com docs git clone branch还可以在结果存储库中的该提交处获取标签并分离 HEAD 我试过 git clone branch

随机推荐

  • OCaml 在运行时编译和加载

    我正在尝试实现类似的目标eval 在 OCaml 中 我有一个string我想从中得到一个 OCaml 函数 目前我正在做以下事情 我将字符串转储到new ml并编译文件 Compile implementation Format std
  • JavaScript AJAX 远程记录器 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在平台上开发 JavaScript 应用程序 该平台不支持日志输出 不允许为记录器输出打开新窗口
  • Swift 使用 UnsafePointer 从 UnsafeMutablePointer 获取值

    我正在努力通过contextInfo of typeUnsafeMutablePointer
  • 如何将异常保存在txt文件中?

    public DataTable InsertItemDetails FeedRetailPL objFeedRetPL DataTable GetListID new DataTable try SqlParameter arParams
  • 如何知道 Mongoose 的 upsert 是否创建了新文档?

    我在 node js express js 中有这段代码 var User mongoose model User var usersRouter express Router usersRouter put id function req
  • 升级AGP版本失败

    我无法更新我的项目 当我尝试这样做时 我收到了这条消息 升级助手无法升级此项目 找不到执行将 AGP 版本从 4 1 3 升级到 4 2 0 命令的方法 可能是因为该项目的构建文件使用了升级助手当前不支持的功能 例如 使用定义的常量 在 b
  • 如何在 Treeview 控件中使子节点可见 = false

    我有一个带有树视图控件的窗口窗体 该树视图有一个根节点和 2 个子节点 我的要求是我需要隐藏第一个子节点 是否有可能使特定孩子点头可见为假 是的 您可以从树节点继承并创建您自己的行为 就像这样 public class RootNode T
  • 使用 Angular 6 和 Spring Rest API 下载文件

    我在使用 Angular 6 从 Rest api 下载文件时遇到问题 后端方法 RequestMapping value print id public ResponseEntity
  • 使用python发送消息时出现错误400

    我正在尝试使用 Gmail API 发送电子邮件 我已成功通过身份验证 并且我的计算机上有一个 client secret json 文件 我已经能够使用 Gmail API 网站上的快速入门示例获取标签列表 我已成功将范围重置为 SCOP
  • 如何从蓝牙 LE 设备获取数据

    我有一台支持蓝牙 LE 的蓝牙条形码扫描仪 我试图在扫描时从中获取条形码信息 我可以正常连接onServicesDiscovered被叫到我的BluetoothGattCallback但我不知道从那里该做什么 通过经典的蓝牙连接 您将获得I
  • 使用 Redux 获取数据时如何避免竞争条件?

    我们有一个异步获取对象的操作 我们称之为getPostDetails 它需要一个参数来获取哪个帖子 一个 ID 用户会看到一个帖子列表 可以单击其中一个来获取一些详细信息 如果用户点击 Post 1 我们会发送一个GET POST动作可能看
  • 尝试连接到cleardb时出错

    再次嗨 我想连接到heroku中的cleardb实例 我从heroku配置变量中获取主机名和凭据CLEAR DATABASE URL但我收到以下错误 错误 2003 HY000 无法连接到 us cdbr east 06 cleardb n
  • 为什么我应该开始使用 Google Material Design Lite 而不是 Twitter Bootstrap 或 Foundation

    免责声明 我不想开始任何对抗谷歌粉丝 我只是问 因为我没有找到我的问题的直接答案 也许已经开始使用它的人 或任何谷歌开发人员 可以提供建议 谷歌最近宣布材料设计精简版 1 0 https developers google com web
  • (R, dplyr) 选择以相同字符串开头的多列并按组汇总平均值 (90% CI)

    我是 tidyverse 的新手 从概念上讲 我想计算以 ab 开头 按 case 分组的所有列的平均值和 90 CI 尝试了很多方法 但似乎都不起作用 我的实际数据有很多列 所以明确列出它们不是一个选择 测试数据如下 library ti
  • Keycloak 支持基本身份验证吗?

    Keycloak 是否支持基本身份验证 授权标头包含单词 Basic 单词 后跟一个空格和一个 base64 编码的字符串 username password 如果支持 我如何为其配置领域和客户端设置 我想使用 Keycloak 保护我的其
  • Android异常处理最佳实践?

    如果我的应用程序崩溃 它会挂起几秒钟 然后 Android 告诉我该应用程序崩溃并需要关闭 所以我正在考虑用一般的方法捕获我的应用程序中的所有异常 try catch Exception e 并制作一个新的Activity这解释了应用程序立
  • 如何确定日期是否是周末(不使用 lubridate)

    我有一个日期对象向量 yyyy mm dd 我想确定其中是否有周末 有没有一个函数可以直接确定这一点 我可以用wday in the 润滑封装然后判断返回值是否为01 or 07 但是还有其他更直接的吗 x lt seq Sys Date
  • 未捕获的类型错误:fs.readFileSync 不是函数

    我正在尝试获取 webpack 和地图盒 GL https github com mapbox mapbox gl js blob master webpack config example js在 Meteor 系统中协同工作 我到处都查
  • Folium 地图未在 Django 网页中显示

    对于 Django 以及一般的 Web 开发 来说非常陌生 所以提前道歉 我试图在 Django 网页中显示我的 Folium 地图 但我似乎不明白为什么我最终会得到一个空白屏幕 我在 SO 中查找了其他帖子 但他们都要求要么专门弹出窗口
  • 如何从 git 历史记录中删除除最后 n 次提交之外的所有提交以节省空间

    我使用 git 来备份和恢复系统上可能发生更改的文件夹 并且随着无用的历史记录的积累 它们可能会变得非常大 我只需要最后 4 次左右的提交 如何压缩或删除除最后 n 次提交之外的整个历史记录 免责声明 不幸的是 您的第一句话可能玷污了这个问