Git 删除最早一次提交的问题

2020-06-18 21:06:13 +08:00
 flyn

求助 V 友们,我刚刚学了 Git 不久,可能遇到了非常蠢的问题,大佬轻点喷:

由于不太了解原理,第一次 git commit 提交了一个大文件然后推送到了远程。然后在网上查资料,想在彻底删除这个大文件的基础上保留后面的所有 commit 。但是关于如下两个问题没有找到理想的解决方法。

  1. 查阅资料发现,想要删除中间的一个 commit,需要使用 git rebase -i <欲删除的 commit 对应的前一串 hash>,然后从 pick 改成 drop 之类的 balabala 。那么问题来了,我想删掉最早一个 commit,那么这个 commit 的前面已经没有提交记录了......所以该怎么做呢?

  2. 接上个问题,因为没有找到合适的方法,干脆降低期望值,直接新建一个分支,扔掉了之前所有的 commit 和旧分支。然后问题来了,大文件占用的空间依然没有减少。于是查资料,按照网上各种千篇一律转载的方法,比如这个https://www.jianshu.com/p/c699e83026c4,然后卡在了 git verify-pack -v .git/objects/pack/pack-<hash>.idx | sort -k 3 -n | tail -10 这步,提示我找不到文件。我已经填写了文件资源管理器中找到的占用空间最大的那个 .idx 文件对应的 dat 文件的 hash 了。那么我该如何做呢?

3346 次点击
所在节点    git
8 条回复
hantsy
2020-06-18 21:07:58 +08:00
git rebase -i --root
monsterxx03
2020-06-18 21:28:02 +08:00
还可以用 git filter-repo 插件清理大文件
AlisaDestiny
2020-06-18 23:23:27 +08:00
如果你 commit history 不重要,你可以直接删掉 repo,然后删除本地项目下的.git 目录。重新建立一个同名项目,git init ,git remote add origin.再 push 上去。
Vegetable
2020-06-18 23:26:32 +08:00
git gc --aggressivey 应能删掉不被引用的文件
Ariver
2020-06-19 06:27:23 +08:00
最简单的重新初始化一个 repo
msg7086
2020-06-19 06:34:35 +08:00
腾空间需要做一个很复杂的 gc,需要把没用的对象都强制过期才能 gc 掉。可以搜一下命令,我自己也记不住,得每次搜。
baiyi
2020-06-19 08:43:11 +08:00
如果你已经重写了,并且保证没有分支或其他引用能指向,那就可以 gc,试试 git gc --prune=now
vevlins
2020-06-19 09:38:45 +08:00
没解决过这种问题,提两个思路,不一定可行:
1.试试 git revert 抵消掉第一次 commit,推到远程后删掉本地仓库,再用 git clone --depth 1 从远程仓库只拉取最近一次 commit
2. git cherry-pick 把后面的 commit 都搬走,然后删掉原来的分支

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/682835

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX