亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

 

前提

在友人的提醒下,發先自己的Github的項目體積過大,在只有一個src文件夾加上一些webpack配置,里面就2個html和一個輸出console.log的js的情況下,項目體積竟然又13MB,這顯然是不正常的,于是,開始解決這個問題!

問題所在

首先查看整個項目文件夾下的大小

$ du -d 1 -h
復制代碼

發現是.git文件夾過大,然后一個一個點進去,.git->objects->pack ,里面的文件太大了,其中一個竟然有12MB。

原因

github在你執行git init操作后,會創建一個.git的隱藏文件夾,該目錄結構如下

$ ls
HEAD  // 指向當前分支
branches/   // 目錄
config  // 項目特有的配置選項
description  // 僅供 GitWeb 程序使用
hooks/  // 保存了客戶端或服務端鉤子腳本
index  // 保存了暫存區域信息
info/  // 保存了一份不希望在 .gitignore 文件中管理的忽略模式 (ignored patterns) 的全局可執行文件
objects/  // 存儲所有數據內容
refs/  // 存儲指向數據 (分支) 的提交對象的指針
復制代碼

在你git add 和 git commit 的過程中,保存修改了的文件的 blob,更新索引,創建 tree 對象,最后創建 commit 對象,這些 commit 對象指向了頂層 tree 對象以及先前的 commit 對象。這三類 Git 對象 ── blob,tree 以及 commit ── 都各自以文件的方式保存在 .git/objects 目錄下。

所以,當你提交了一個體積特別大的文件后,會記錄在objects文件夾下,刪除一個文件,只是記錄了刪除這個操作,但并不會把文件從.git文件夾刪除。 當你直接從項目中刪除該文件,.git文件夾完全不會變小(理論上還會變大一點,因為多記錄了一次刪除操作。。。)。

git會記錄你的每一次操作,這個是使用git中的很重要的概念

更多內容請點擊git內部原理

解決

解決問題之前,請先出去抽支煙,確定自己清楚了這個操作的危險性。(建議先弄一個測試庫試上幾遍)

操作前提:刪除所有的分支,只留下一個master

首先查找出大文件

$ git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"
復制代碼

rev-list命令用來列出Git倉庫中的提交,我們用它來列出所有提交中涉及的文件名及其ID。 該命令可以指定只顯示某個引用(或分支)的上下游的提交。
--objects:列出該提交涉及的所有文件ID。
--all:所有分支的提交,相當于指定了位于/refs下的所有引用。
verify-pack命令用于顯示已打包的內容,我們用它來找到那些大文件。
-v(verbose)參數是打印詳細信息。

前面我們通過rev-list得到了文件名-ID的對應關系,通過verify-pack得到了最大的5個文件ID。 用后者篩選前者便能得到最大的5個文件的文件名,比如:

$ git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"
b96695fd6e62fff41723ab324368da394f3a504e package-lock.json
76ec4d5d5fd79da922b322d53fbd1298dc128dd3 node_modules/acorn/dist/acorn.mjs.map
286dc92a240dac765d81dfbda451fd19f9611e84 node_modules/ajv/dist/ajv.bundle.js
d2cc86eb230313af9bbdbd3faed7f8e7c7247788 node_modules/source-map-support/node_modules/source-map/dist/source-map.min.js.map
aad0620d70e16717ec338fc1d332279739e0d97c node_modules/terser/node_modules/source-map/dist/source-map.debug.js

復制代碼

然后我們需要刪除他們

$ git filter-branch --force --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch YOU-FILE-NAME' --tag-name-filter cat -- --all

復制代碼

filter-branch命令可以用來重寫Git倉庫中的提交
--index-filter參數用來指定一條Bash命令,然后Git會檢出(checkout)所有的提交, 執行該命令,然后重新提交。
–all參數表示我們需要重寫所有分支(或引用)。
YOU-FILE-NAME 你查找出來的大文件名字

重復幾次,直到大文件全部刪除完畢。

如果你確定某一個文件夾下面都不是你需要的,那么你可以直接刪除整個文件夾,比如:

$ git filter-branch --force --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch node_modules' --tag-name-filter cat -- --all
復制代碼

完成后,以強制覆蓋的方式推送你的repo, 命令如下:

$ git push --force --all
復制代碼

最后,雖然上面我們已經刪除了文件, 但是我們的repo里面仍然保留了這些objects, 等待垃圾回收(GC), 所以我們要用命令徹底清除它, 并收回空間,命令如下:

$ rm -rf .git/refs/original/
$ git reflog expire --expire=now --all
$ git gc --prune=now
Enumerating objects: 116, done.
Counting objects: 100% (116/116), done.
Delta compression using up to 4 threads
Compressing objects: 100% (53/53), done.
Writing objects: 100% (116/116), done.
Total 116 (delta 55), reused 116 (delta 55)

復制代碼

經驗教訓

雖然折騰了半天,也成功解決了這個問題。

從中吸取了一個教訓:

當你創建了項目后,沒有設置好.gitignore之前,千萬不要提交代碼!!!還有就是,大文件盡量不要提交。

.gitignore設置: 在項目根目錄創建.gitignore文件

.DS_Store
node_modules
/dist

# local env files
.env.local
.env.*.local

# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw*

復制代碼

參考: 尋找并刪除Git記錄中的大文件 徹底刪除git中沒用的大文件


轉載鏈接:
https://juejin.cn/post/6844903848864137229

分享到:
標簽:Github
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定