您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關Git維護小技巧有哪些的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
對 Git 倉庫的維護通常是為了減少倉庫的大小。如果你從另外一個版本控制系統導入了一個倉庫,你可能需要在導入后清除掉不必要的文件。
本文中的步驟和工具使用的高級技術涉及破壞性操作。確保您在開始之前仔細讀過并備份了你的倉庫,創建一個備份最容易的方式是使用-mirror標志對你的倉庫克隆,然后對整個克隆的文件進行打包壓縮。有了這個備份,如果在維護期間意外損壞了您的倉庫的關鍵元素,那么你可以通過備份的倉庫來恢復。
請記住,倉庫維護對倉庫的用戶可能會是毀滅性的。與你的團隊或者倉庫的關注者進行溝通會是一個不錯的主意。確保每個人都已經檢查了他們的代碼,并且同意在倉庫維護期間停止開發。
回想一下,克隆倉庫會克隆整個歷史記錄——包括每個源代碼文件的所有版本。如果一個用戶提交了一個較大的文件,比如一個 JAR,則隨后的每次克隆都會包含這個文件。即使用戶最終在后面的某次提交中刪除了這個文件,但是這個文件仍然存在于這個倉庫的歷史記錄中。要想完全的從你的倉庫中刪除這個文件,你必須:
Git 的 “gc”(垃圾回收)將通過你的任何一個分支或者標簽來刪除倉庫中所有的實際沒用的或者以某種方式引用的數據。為了使其發揮作用,我們需要重寫包含不需要的文件的所有 Git 倉庫歷史記錄,倉庫將不再引用它—— git gc 將會丟棄所有沒用的數據。
重寫存儲庫歷史是一個棘手的事情,因為每個提交都依賴它的父提交,所以任何一個很小的改變都會改變它的每一個隨后的提交的提交 ID。有兩個自動化的工具可以做到這:
切記,當你重寫歷史記錄后,無論你是使用 BFG 還是使用 filter-branch,你都需要刪除指向舊的歷史記錄的reflog條目,最后運行垃圾回收器來刪除舊的數據。
BFG是為將像大文件或者密碼這些不想要的數據從 Git 倉庫中刪除而專門設計的,所以它有一一個簡單的標志用來刪除那些大的歷史文件(不在當前的提交里面):–strip-blobs-bigger-than
$ java -jar bfg.jar --strip-blobs-than 100M
大小超過 100MB 的任何文件(不包含在你最近的提交中的文件——因為 BFG默認會保護你的最新提交的內容)將會從你的 Git 倉庫的歷史記錄中刪除。如果你想用名字來指明具體的文件,你也可以這樣做:
$ java -jar bfg.jar --delete-files *.mp4
BFG 的速度要比git filter-branch快10-1000 倍,而且通常更容易使用——查看完整的使用說明和示例獲取更多細節。
filter-branch命令可以對 Git 倉庫的歷史記錄重寫,就像 BFG 一樣,但是過程更慢和更手動化。如果你不知道這些大文件在哪里,那么你第一步就需要找到它們:
Antony Stubbs寫了一個可以很好地完成這個功能的 BASH 腳本。該腳本可以檢查你的包文件的內容并列出大文件。在你開始刪除文件之前,請執行以下操作獲取并安裝此腳本:
1、 下載腳本到你的本地的系統。 2、 將它放在一個可以訪問你的 Git 倉庫的易于找到的位置。 3、 讓腳本成為可執行文件:
$ chmod 777 git_find_big.sh
4、 克隆倉庫到你本地系統。 5、 改變當前目錄到你的倉庫根目錄。 6、 手動運行 Git 垃圾回收器:
git gc --auto
7、 找出 .git 文件夾的大小
$ du -hs .git/objects 45M .git/objects
注意文件大小,以便隨后參考。 8、 運行git_find_big.sh腳本來列出你的倉庫中的大文件。
$ git_find_big.sh All sizes are in kB's. The pack column is the size of the object, compressed, inside the pack file. size pack SHA location 592 580 e3117f48bc305dd1f5ae0df3419a0ce2d9617336 media/img/emojis.jar 550 169 b594a7f59ba7ba9daebb20447a87ea4357874f43 media/js/aui/aui-dependencies.jar 518 514 22f7f9a84905aaec019dae9ea1279a9450277130 media/images/screenshots/issue-tracker-wiki.jar 337 92 1fd8ac97c9fecf74ba6246eacef8288e89b4bff5 media/js/lib/bundle.js 240 239 e0c26d9959bd583e5ef32b6206fc8abe5fea8624 media/img/featuretour/heroshot.png
大文件都是 JAR 文件,包的大小列是最相關的。aui-dependencies.jar被壓縮到 169kb,但是emojis.jar只壓縮到 500kb。emojis.jar就是一個待刪除的對象。
運行 filter-branch
你可以給這個命令傳遞一個用于重寫 Git 索引的過濾器。例如,一個過濾器可以可以將每個檢索的提交刪除。這個用法如下:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch _pathname_ ' commitHASH
–index-filter選項可以修改倉庫的索引,–cached選項從索引中而不是磁盤來刪除文件。這樣會更快,因為你不需要在運行這個過濾器前檢查每個修訂版本。git rm中的ignore-unmatch選項可以防止在嘗試移走不存在的文件pathname的時候命令失敗。通過指定一個提交 HASH 值,你可以從每個以這個 HASH 值開始的提交中刪除pathname。要從開始處刪除,你可以省略這個參數或者指定為HEAD。
如果你的大文件在不同的分支,你將需要通過名字來刪除每個文件。如果大文件都在一個單獨的分支,你可以直接刪除這個分支本身。
選項 1:通過文件名刪除文件
使用下面的步驟來刪除大文件: 1、 使用下面的命令來刪除你找到的第一個大文件:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD
2、 重復步驟 1 找到剩下的每個大文件。 3、 在你的倉庫里更新引用。filter-branch會為你原先的引用創建一個refs/original/下的備份。一旦你確信已經刪除了正確的文件,你可以運行下面的命令來刪除備份文件,同時可以讓垃圾回收器回收大的對象:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD
選項 2:直接刪除分支
如果你所有的大文件都在一個單獨的分支上,你可以直接刪除這個分支。刪除這個分支會自動刪除所有的引用。
1、 刪除分支。
$ git branch -D PROJ567bugfix
2、 從后面的分支中刪除所有的 reflog 引用。
對不用的數據垃圾回收
1、 刪除從現在到后面的所有 reflog 引用(除非你明確地只在一個分支上操作)。
$ git reflog expire --expire=now --all
2、 通過運行垃圾回收器和刪除舊的對象重新打包倉庫。
$ git gc --prune=now
3、 把你所有的修改推送回倉庫。
$ git push --all --force
4、 確保你所有的標簽也是當前最新的:
$ git push --tags --force
感謝各位的閱讀!關于“Git維護小技巧有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。