昨天突然有人跟我說我在gitlab上的乙個倉庫占用的記憶體很大,導致pull下來時間有點久。我檢查了一下發現原來是我把幾個大檔案push上去了,而這幾個大檔案其實沒必要傳上去,很尷尬。。。因為這個gitlab倉庫是大家公用的,所以今天上午在嘗試如何把這幾個大檔案刪除並且把記錄抹去,雖然最後沒有完全解決,但還是記錄一下我嘗試的過程。
這個故事告訴大家,在git add . 之後一定要檢查一下自己加了什麼,不要直接commit,然後push。。。 t-t
git是乙個可以記錄你所有改動的工具,比如你在某個分支上進行了2次commit,在第一次commit的時候push了乙個100m的檔案,在第二次commit的時候,對檔案進行了修改,然後再push上去,那麼git倉庫會記錄下這兩次的改動,也就是說這個git倉庫會儲存這兩個100m的檔案,即使你在第三次commit中把這個檔案刪除了,但是git還是會儲存前面兩次的記錄,所以如果你想徹底刪除某個檔案也要一併刪除之前的歷史記錄。
對於一些沒必要的大檔案,就不要上傳到git倉庫中,不然你的git倉庫會越來越臃腫。
其他git原理可以參考 git原理
如果你是在某個分支上push的,而且這個分支沒什麼用,就直接刪除該分支。
如果你是想刪除的檔案是在一次commit中上傳的,可以通過**回滾來回退到上傳之前的狀態。
git reset --hard commit_value
但是假設你一共做了5次commit,是在第三次commit的時候上傳了不想要的檔案,可是第四次和第五次commit都做了一些其他改動,而且不想這些改動被撤銷,該怎麼辦呢?
1)先建立乙個和之前分支a一樣的分支b
2)在分支a上做**回退,回退到第三次commit之前的狀態,這個時候在分支a上就只有第一次和第2次的commit資訊,但是在分支b上有第一次到第五次的commit資訊
3)通過git log檢視到第四次和第五次commit的hash值,然後在分支a上,通過git cherry-pick來將第四次commit 和第五次commit合併過來。
git checkout a
git cherry-pick commit4_value
git cherry-pick commit5_value
合併過來之後,在分支a上就只有第一次、第二次和第四次、第五次commit的資訊了,第三次commit的資訊就被刪除了,最後再把分支a push上去就ok了。
前面兩種方法都是比較簡單的情形。但假如你是突然發現你的git倉庫有很多不必要的檔案,但是可能經過多次commit上傳上去的,如果通過之前的一次一次回退太麻煩了,或者說你想刪除的檔案在其他分支上也有。這個時候有乙個命令可以幫到你:git filter-branch。這個命令要慎用。
git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch file_you_want_to_delete.jar' --prune-empty --all
– prune-empty表示如果修改後的提交為空則扔掉不要
– all 表示重寫所有分支
執行命令後會有以下輸出:
$ git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch ***.jar'
rewrite fd679c8b90abdf900b95e132bacb3300c04bcd01 (3/3) (1 seconds passed, remaining 0 predicted) rm '***.jar'
ref 'refs/heads/test' was rewritten
接著,再推送修改後的repo,並且清理和**空間
git push --force
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
至此,在遠端的git repo中就看不到你想要刪掉的檔案了。有關git filter-branch命令的更多用法可以參考 git 重寫歷史。
記一次刪除git記錄中的大檔案的過程。
寫在最後
用了以上的方法之後,我確實在遠端看不到我想要刪除的大檔案了,也沒有之前的commit記錄了,可是在repo的資訊這裡還是顯示的files佔據的空間很大。
上顯示40m,實際只有幾十k。不知道是不是因為我們公司的gitlab禁用掉gc了?下次在自己的github上試試看。
刪除GitHub或者GitLab 上的資料夾
方法一 這裡以刪除 setting 資料夾為案例 git rm r cached setting cached不會把本地的.setting刪除 git commit m delete setting dir git push u origin master方法二 如果誤提交的資料夾比較多,方法一也較...
linux上如何刪除檔名為亂碼的檔案
linux上如何刪除檔名為亂碼的檔案 root doit01 ll total 8 rw 1 root root 1675 nov 10 05 33 3 rw r r 1 root root 393 nov 10 05 33 3 pub今天在伺服器上看到兩個檔名為亂碼的檔案,你想刪掉他,但是你複製他...
如何刪除檔案及資料夾下的所有檔案 vb
本示例使用kill語句將磁碟中的檔案刪除。假設testfile是一資料檔案。kill testfile 刪除。將當前目錄下所有 txt檔案全部刪除。kill txt kill 這裡顯示你要刪除的檔案 呵呵,簡單吧。mypath target 指定路徑。mypath 是要刪除的資料夾 myname d...