如何清除.git文件夾中的大文件
- 不小心把第三方庫(kù)提交上去了...怎么辦...
Step1.找到大文件
1.1 運(yùn)行count-objects 查看空間使用
$ git count-objects -v
執(zhí)行結(jié)果
count: 302
size: 1208
in-pack: 4008
packs: 1
size-pack: 136897
prune-packable: 0
garbage: 0
size-garbage: 0
size-pack 是以kb為單位表示的,可以看出大約使用了136M+的空間.
1.2 找到大文件
對(duì)輸出的第三列信息即文件大小進(jìn)行排序,獲取最大的四個(gè)文件.
$ git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -n | tail -4
執(zhí)行結(jié)果
3d9c87e2f6afef65d42186ae8ec1ff368159db0f blob 29441232 12551486 6104728
8f527ad31d8d7fa944cd5a9a8a397143792d9874 blob 34741680 10231790 30056275
8f527ad31d8d7fa944cd5a9a8a397143792d9874 blob 34741680 10231790 30606600
1696a4dcf57e12bc086b06cd6ccc6fca3c10aad2 blob 36405168 15230074 54498174
可以看到最后一個(gè)文件占用了54M+的空間
然后通過下面的命令找到文件的名稱
$ git rev-list --objects --all | grep 1696a4
執(zhí)行結(jié)果
1696a4dcf57e12bc086b06cd6ccc6fca3c10aad2 Pods/NIMSDK/SDK/NIMSDK/libNIMSDK.a
原來是將第三方庫(kù)也傳到了git上...??
那接下來把所有的NIMSDK庫(kù)相關(guān)的大文件都找出來吧
$ git rev-list --objects --all
在執(zhí)行結(jié)果中找到NIMSDK相關(guān)的部分(只列出部分)
898b1c3387231612c04e54cb52bdb96a79ffab58 Pods/NIMSDK/SDK/NIMSDK/Libs
f6a4e44810385b356ce50ef25b3a51cb498c5a3d Pods/NIMSDK/SDK/NIMSDK/Libs/libaacplus.a
9b081280e85bbb5bc71a3f7f460934d4581de657 Pods/NIMSDK/SDK/NIMSDK/Libs/libcrypto.a
d6021535586d095602466fa91733e4c84f294b35 Pods/NIMSDK/SDK/NIMSDK/Libs/libevent.a
8bb1d1c76786c4e2f2de1b6e83134bd4c0689296 Pods/NIMSDK/SDK/NIMSDK/Libs/libssl.a
1696a4dcf57e12bc086b06cd6ccc6fca3c10aad2 Pods/NIMSDK/SDK/NIMSDK/libNIMSDK.a
確認(rèn)了一下 都在Pods文件夾里面醋界! 而且Pods文件夾里只有與NIMSDK相關(guān)的文件. 接下來就是刪除它們了.
2.移除git與大文件的引用關(guān)系
通過filter-branch遍歷git,并移除與Pods文件夾中文件的引用關(guān)系
$ git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch Pods'
現(xiàn)在歷史記錄中已經(jīng)不包含對(duì)于那些大文件的引用了.
3.轉(zhuǎn)移倉(cāng)庫(kù)
$ git clone file:///path/to/repository.
Note that the file:// makes a world of difference when cloning a local repository - only the referenced objects are copied across, not the whole directory structure.
譯:注意當(dāng)復(fù)制一個(gè)本地倉(cāng)庫(kù)的時(shí)候肴颊,file://讓一切變得大不相同.--只有擁有引用關(guān)系的文件會(huì)復(fù)制過去,而不是所有的文件結(jié)構(gòu)!
這樣的話我們就可以通過這個(gè)方法丟掉那些大文件啦,于此同時(shí)保留的剩余的文件以及引用關(guān)系.
That's all.
轉(zhuǎn)移倉(cāng)庫(kù)部分具體參見:
http://stackoverflow.com/questions/1029969/why-is-my-git-repository-so-big/1036595#