github 怎么把大文件 commit 记录删除

2023-08-20 19:59:14 +08:00
 hentailolicon

vscode debug 的时候忘记关的时候把 debug 文件 push 到 github 上了 然后删掉 push 后发现拉取的时候还是需要把这个历史大文件拉下来导致其他人 git pull 很慢 有什么好的办法处理掉吗

3968 次点击
所在节点    酷工作
27 条回复
xubeiyan
2023-08-21 13:12:27 +08:00
@SimonOne 本质就是这样的,但 squash 还是 edit 需要你去做判断

大概是从这个回答得到的答案 https://stackoverflow.com/questions/307828/how-do-you-fix-a-bad-merge-and-replay-your-good-commits-onto-a-fixed-merge#answer-23188613

从中就可以看出 reset 并不是一个好办法,因为你需要 hard reset + rebase 。而上面的 reset 回答全部没有提到这点,说明他们连 hard reset 和 reset 区别是什么都搞不清楚,也不知到后面的 rebase 要经历怎样的苦难

我的答案大概是 Solution 4 的简化版,其中使用了 Interactive Rebase

首先,你需要从要移除的提交开始执行 interactive rebase
`git rebase -i <要移除的前一个提交>~`
当然也可以指定结束的提交,注意结束的那个提交不会被删除
`git rebase -i <要移除的提交前一个提交开始> <要移除的提交结束>`

就可以看到你的提交了,直接把不想要的那几行前面的 pick -> squash 了(默认的操作编辑器是 vim ,感受一下命令行最叼编辑器吧),但你很容易删错,因为你此时看不到到底那几个提交记录了你哪几个文件,更改提交则使用 pick -> edit
接下来保存退出(什么你连保存退出 vim 都不会那还是趁早放弃吧——)

再执行`git commit --amend`保存这次修改,最后`git rebase --continue`就完成了这次修改,再 force push 到远端就抹除了,其他人已有你那个提交最简单就是重新 clone 一个,不然还要重新 merge

其实是很复杂的,你可以随时`git log`看看变化。

简化到 GUI 上就是打开提交历史,压扁成一个提交,没了就这么简单。

这是我这么多年和 git 搏斗总结的经验,如果还是有冥顽不化的人非要 reset 那只能祝你早日被 git 气到中风
SimonOne
2023-08-21 13:42:25 +08:00
@xubeiyan #21 我一般用 sourcetree ,但是没找到这种合并几个提交的地方,所以我用 sourcetree 先看下几个提交,然后再命令行 rebase 合并。但是就我一个人,就一个分支 main ,弄烂了大不了重新远端拉下来重来。
如果是多人项目,分支有好几个的,我不敢动直接开摆。🙈
guguji5
2023-08-21 14:09:02 +08:00
![把 100M 的视频提交到 git 后,差点下不了班]( https://zhuanlan.zhihu.com/p/532076688)
yunyuyuan
2023-08-21 14:16:07 +08:00
reset 然后 force push 并不能完全删除,不信可以在 github 的 activity 里看,Force push 的 commit 依然能看到,完全删除需要 BFG ,楼上说过 https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository
xubeiyan
2023-08-21 14:50:34 +08:00
@SimonOne 同事也是推荐我用 source tree ,但我发现竟然没有这种救我于水火的功能,就叛逃到 tortoisegit 门下了。一般多人开发的话还是要商讨有无必要做这件事,确认必须要做然后你们 git 比较熟的人来做这件事,因为这个还是挺危险的操作。顺便如果不想重新 clone ,pull 的时候加上 force 也可以强制覆盖你本地的,但为了不至于丢失原来的数据,一般推荐是重新 clone ,有什么失误也可以保留一份之前的好拯救
shawndev
2023-08-21 19:39:54 +08:00
https://github.com/rtyley/bfg-repo-cleaner

我们之前的项目用的是 BFG 这个工具,很多国产 SDK 只提供二进制的依赖,几次迭代之后仓库就大过银河系了。
san3
2023-08-24 18:48:17 +08:00
git filter-branch 可行

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

https://ex.noerr.eu.org/t/966874

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

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

© 2021 V2EX