日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Git維護(hù)小技巧

對 Git 倉庫的維護(hù)通常是為了減少倉庫的大小。如果你從另外一個(gè)版本控制系統(tǒng)導(dǎo)入了一個(gè)倉庫,你可能需要在導(dǎo)入后清除掉不必要的文件。本文著重于從一個(gè) Git 倉庫中刪除大文件,并且包含下列主題:

10余年專注成都網(wǎng)站制作,企業(yè)網(wǎng)站制作,個(gè)人網(wǎng)站制作服務(wù),為大家分享網(wǎng)站制作知識(shí)、方案,網(wǎng)站設(shè)計(jì)流程、步驟,成功服務(wù)上千家企業(yè)。為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),專注于企業(yè)網(wǎng)站制作,高端網(wǎng)頁制作,對成都葡萄架等多個(gè)領(lǐng)域,擁有豐富建站經(jīng)驗(yàn)。

  • 理解從 Git 的歷史記錄中刪除文件
  • 使用 BFG 重寫歷史記錄
  • 可選,使用git filter-branch重寫歷史記錄
  • 垃圾回收

本文中的步驟和工具使用的高級技術(shù)涉及破壞性操作。確保您在開始之前仔細(xì)讀過并備份了你的倉庫,創(chuàng)建一個(gè)備份最容易的方式是使用–mirror標(biāo)志對你的倉庫克隆,然后對整個(gè)克隆的文件進(jìn)行打包壓縮。有了這個(gè)備份,如果在維護(hù)期間意外損壞了您的倉庫的關(guān)鍵元素,那么你可以通過備份的倉庫來恢復(fù)。

請記住,倉庫維護(hù)對倉庫的用戶可能會(huì)是毀滅性的。與你的團(tuán)隊(duì)或者倉庫的關(guān)注者進(jìn)行溝通會(huì)是一個(gè)不錯(cuò)的主意。確保每個(gè)人都已經(jīng)檢查了他們的代碼,并且同意在倉庫維護(hù)期間停止開發(fā)。

理解從 Git 的歷史記錄中刪除文件

回想一下,克隆倉庫會(huì)克隆整個(gè)歷史記錄——包括每個(gè)源代碼文件的所有版本。如果一個(gè)用戶提交了一個(gè)較大的文件,比如一個(gè) JAR,則隨后的每次克隆都會(huì)包含這個(gè)文件。即使用戶最終在后面的某次提交中刪除了這個(gè)文件,但是這個(gè)文件仍然存在于這個(gè)倉庫的歷史記錄中。要想完全的從你的倉庫中刪除這個(gè)文件,你必須:

  • 從你的項(xiàng)目的當(dāng)前的文件樹中刪除該文件;
  • 從倉庫的歷史記錄中刪除文件——重寫Git 歷史記錄,從包含該文件的所有的提交中刪除這個(gè)文件;
  • 刪除指向舊的提交歷史記錄的所有reflog歷史記錄;
  • 重新整理倉庫,使用git gc對現(xiàn)在沒有使用的數(shù)據(jù)進(jìn)行垃圾回收。

Git 的 “gc”(垃圾回收)將通過你的任何一個(gè)分支或者標(biāo)簽來刪除倉庫中所有的實(shí)際沒用的或者以某種方式引用的數(shù)據(jù)。為了使其發(fā)揮作用,我們需要重寫包含不需要的文件的所有 Git 倉庫歷史記錄,倉庫將不再引用它—— git gc 將會(huì)丟棄所有沒用的數(shù)據(jù)。

重寫存儲(chǔ)庫歷史是一個(gè)棘手的事情,因?yàn)槊總€(gè)提交都依賴它的父提交,所以任何一個(gè)很小的改變都會(huì)改變它的每一個(gè)隨后的提交的提交 ID。有兩個(gè)自動(dòng)化的工具可以做到這:

  1. BFG Repo Cleaner快速、簡單且易于使用,需要 Java 6 或者更高版本的運(yùn)行環(huán)境。
  2. git filter-branch功能強(qiáng)大、配置麻煩,用于大于倉庫時(shí)速度較慢,是核心 Git 套件的一部分。

切記,當(dāng)你重寫歷史記錄后,無論你是使用 BFG 還是使用 filter-branch,你都需要?jiǎng)h除指向舊的歷史記錄的reflog條目,最后運(yùn)行垃圾回收器來刪除舊的數(shù)據(jù)。

使用 BFG 重寫歷史記錄

BFG是為將像大文件或者密碼這些不想要的數(shù)據(jù)從 Git 倉庫中刪除而專門設(shè)計(jì)的,所以它有一一個(gè)簡單的標(biāo)志用來刪除那些大的歷史文件(不在當(dāng)前的提交里面):–strip-blobs-bigger-than

$ java -jar bfg.jar --strip-blobs-than 100M

大小超過 100MB 的任何文件(不包含在你最近的提交中的文件——因?yàn)?BFG默認(rèn)會(huì)保護(hù)你的最新提交的內(nèi)容)將會(huì)從你的 Git 倉庫的歷史記錄中刪除。如果你想用名字來指明具體的文件,你也可以這樣做:

$ java -jar bfg.jar --delete-files *.mp4

BFG 的速度要比git filter-branch快10-1000 倍,而且通常更容易使用——查看完整的使用說明和示例獲取更多細(xì)節(jié)。

使用 git filter-branch 來重寫歷史記錄

filter-branch命令可以對 Git 倉庫的歷史記錄重寫,就像 BFG 一樣,但是過程更慢和更手動(dòng)化。如果你不知道這些大文件在哪里,那么你第一步就需要找到它們:

手動(dòng)查看你 Git 倉庫中的大文件

Antony Stubbs寫了一個(gè)可以很好地完成這個(gè)功能的 BASH 腳本。該腳本可以檢查你的包文件的內(nèi)容并列出大文件。在你開始刪除文件之前,請執(zhí)行以下操作獲取并安裝此腳本:

1、 下載腳本到你的本地的系統(tǒng)。 2、 將它放在一個(gè)可以訪問你的 Git 倉庫的易于找到的位置。 3、 讓腳本成為可執(zhí)行文件:

$ chmod 777 git_find_big.sh

4、 克隆倉庫到你本地系統(tǒng)。 5、 改變當(dāng)前目錄到你的倉庫根目錄。 6、 手動(dòng)運(yùn)行 Git 垃圾回收器:

git gc --auto

7、 找出 .git 文件夾的大小

$ du -hs .git/objects
45M .git/objects

注意文件大小,以便隨后參考。 8、 運(yùn)行g(shù)it_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 文件,包的大小列是最相關(guān)的。aui-dependencies.jar被壓縮到 169kb,但是emojis.jar只壓縮到 500kb。emojis.jar就是一個(gè)待刪除的對象。

運(yùn)行 filter-branch

你可以給這個(gè)命令傳遞一個(gè)用于重寫 Git 索引的過濾器。例如,一個(gè)過濾器可以可以將每個(gè)檢索的提交刪除。這個(gè)用法如下:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch  _pathname_ ' commitHASH

–index-filter選項(xiàng)可以修改倉庫的索引,–cached選項(xiàng)從索引中而不是磁盤來刪除文件。這樣會(huì)更快,因?yàn)槟悴恍枰谶\(yùn)行這個(gè)過濾器前檢查每個(gè)修訂版本。git rm中的ignore-unmatch選項(xiàng)可以防止在嘗試移走不存在的文件pathname的時(shí)候命令失敗。通過指定一個(gè)提交 HASH 值,你可以從每個(gè)以這個(gè) HASH 值開始的提交中刪除pathname。要從開始處刪除,你可以省略這個(gè)參數(shù)或者指定為HEAD。

如果你的大文件在不同的分支,你將需要通過名字來刪除每個(gè)文件。如果大文件都在一個(gè)單獨(dú)的分支,你可以直接刪除這個(gè)分支本身。

選項(xiàng) 1:通過文件名刪除文件

使用下面的步驟來刪除大文件: 1、 使用下面的命令來刪除你找到的第一個(gè)大文件:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

2、 重復(fù)步驟 1 找到剩下的每個(gè)大文件。 3、 在你的倉庫里更新引用。filter-branch會(huì)為你原先的引用創(chuàng)建一個(gè)refs/original/下的備份。一旦你確信已經(jīng)刪除了正確的文件,你可以運(yùn)行下面的命令來刪除備份文件,同時(shí)可以讓垃圾回收器回收大的對象:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

選項(xiàng) 2:直接刪除分支

如果你所有的大文件都在一個(gè)單獨(dú)的分支上,你可以直接刪除這個(gè)分支。刪除這個(gè)分支會(huì)自動(dòng)刪除所有的引用。

1、 刪除分支。

$ git branch -D PROJ567bugfix

2、 從后面的分支中刪除所有的 reflog 引用。

對不用的數(shù)據(jù)垃圾回收

1、 刪除從現(xiàn)在到后面的所有 reflog 引用(除非你明確地只在一個(gè)分支上操作)。

$ git reflog expire --expire=now --all

2、 通過運(yùn)行垃圾回收器和刪除舊的對象重新打包倉庫。

$ git gc --prune=now

3、 把你所有的修改推送回倉庫。

$ git push --all --force

4、 確保你所有的標(biāo)簽也是當(dāng)前最新的:

$ git push --tags --force

本文標(biāo)題:Git維護(hù)小技巧
文章來源:http://www.dlmjj.cn/article/dhhdgec.html