Git 问题求教 - git rm 大文件但是.git 文件夹还是很大,怎么处理

2016-12-01 11:05:21 +08:00
 bonfy
git 的时候不小心把 test 的内容都 commit 进去了

(我明明已经加.gitignore 了,还是会 add 进去。。。当然这个我先不纠结了)

现在的问题是已经 rm 了,但是.git 里面还是有 pack 文件很大,怎么搞呢,明明就是几 kb 的事,现在 clone 下来就是几 MB,99%都是.git 里面的 pack 文件

老司机有遇到这个问题的么? 除了重新建 Repo 还有其他法子不?
6118 次点击
所在节点    程序员
24 条回复
fds
2016-12-01 11:09:01 +08:00
你怎么 rm 的?把 commit 从历史版本里删掉了么?没有的话用 git reset --hard 回到以前,然后 git push --force 强制覆盖。
lrh3321
2016-12-01 11:10:20 +08:00
都已经被提交过了就无解了
除非你先 checkout 到 commit 之前
然后, 把最新分支的内容覆盖一次
接着,重新提交
再 -f 推送到服务器
song4
2016-12-01 11:13:03 +08:00
一旦文件添加进去,就一直在里面了,直接 rm 是没办法把这个文件从历史提交里面移除的。

你需要的是把文件从整个历史里面抹掉:

git filter-branch --index-filter \
'git rm --cached --ignore-unmatch path/to/your/file' \
--tag-name-filter cat -- --all
bonfy
2016-12-01 11:20:15 +08:00
@fds 没把 commit 删掉。。。 我试试 git reset...
bonfy
2016-12-01 11:20:42 +08:00
@lrh3321 已经提交了。。。。
bonfy
2016-12-01 11:21:12 +08:00
@song4 我试试。。。
Citrus
2016-12-01 11:23:02 +08:00
先说方法,你需要这个简单的小工具:
https://rtyley.github.io/bfg-repo-cleaner/

然后说原理:
因为 Git 会记录你 所有 的历史提交,所以为了回滚需要,只要是在 Git 中存在过一次的文件,就会被永久记录下来,不论当前是否存在。
bonfy
2016-12-01 11:25:51 +08:00
@Citrus  这个牛,都已经上升到工具了。。。 Star 好多,看来和我同样问题的 git 新手好多
TangMonk
2016-12-01 11:31:18 +08:00
git rm --cached test
chousb
2016-12-01 11:34:41 +08:00
fan123199
2016-12-01 11:42:25 +08:00
@song4 git filter-branch --index-filter \
'git rm --cached --ignore-unmatch path/to/your/file' \
--tag-name-filter cat -- --all

这个方法学习了,但是不知道对其他成员有没有影响(比如他 pull 或 push 时出错。)。 git 官方说, 修改 public repo 的已有 commit , 会有大影响。
song4
2016-12-01 11:44:45 +08:00
@fan123199 如果调用了这个方法,在向远端 push 的时候,必须强制覆盖:

git push origin --force --all


所以这是一个危险操作,务必再三确认啊!
fan123199
2016-12-01 11:45:32 +08:00
@bonfy 这不是新手问题,如果你的 test 变动还在 HEAD ,那么很简单,按 1L 办,如果又加了新 commit ,那就难办了,所以要认真对待每个 commit ,特别是 push 的时候。
song4
2016-12-01 11:47:27 +08:00
另外,分享一篇文章, Github 官方帮助告诉你怎样从仓库里彻底移除敏感信息: https://help.github.com/articles/remove-sensitive-data/
fan123199
2016-12-01 11:51:41 +08:00
@song4 这个时候,是不是跟 filter 有关的 commit 的 hash 值都会变成新的。如果是的话,感觉是重做了整个 branch 的感觉。这个在公有 repo 还是太危险,行不通。 最好只在本地完成。
song4
2016-12-01 11:56:24 +08:00
@fan123199 确实是你说的这样。

建议尽量不要用这个极端的方法,除非在某些极端的情况下(比如不小心把密钥提交到了版本库里)。
laiqs2011
2016-12-01 12:51:17 +08:00
git gc 试试?
bonfy
2016-12-01 13:17:45 +08:00
@chousb 这个好像就是 @song4 提的那个。 不过有小弟还是令人羡慕啊:)
shibingsw
2016-12-01 13:25:24 +08:00
@song4 这个正解
msg7086
2016-12-01 17:08:29 +08:00
@fan123199 文件就在历史里,你要么改变历史,要么接受历史。
删除文件的话,当然所有 Hash 都要变的。

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

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

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

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

© 2021 V2EX