<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          手把手教你解決.git目錄過大問題

          共 4853字,需瀏覽 10分鐘

           ·

          2022-03-01 18:08

          你知道的越多,不知道的就越多,業(yè)余的像一棵小草!

          你來,我們一起精進!你不來,我和你的競爭對手一起精進!

          編輯:業(yè)余草

          escapelife.site/posts/b400b7f8.html

          推薦:https://www.xttblog.com/?p=5317

          ?

          「紙上得來終覺淺,絕知此事要躬行?!?/strong>

          ?

          Git 是一個分布式版本控制軟件,最初由 「林納斯·托瓦茲」 創(chuàng)作,于 2005 年發(fā)布。最初目的是為更好地管理 Linux 內(nèi)核開發(fā)。Git 在本地磁盤上就保存著所有有關當前項目的歷史更新,處理速度快。Git 中的絕大多數(shù)操作都只需要訪問本地文件和資源,不用實時聯(lián)網(wǎng)。

          • Git LFS(Large File Storage - ??件存儲)是可以把?樂、圖?、視頻等指定的任意?件存在 Git 倉庫之外,?在 Git 倉庫中??個占?空間 1KB 不到的?本指針來代替的??具。通過把??件存儲在 Git 倉庫之外,可以減? Git 倉庫本身的體積,使克隆 Git 倉庫的速度加快,也使得 Git 不會因為倉庫中充滿??件?損失性能。
          • 使? Git LFS,在默認情況下,只有當前簽出的 commit 下的 LFS 對象的當前版本會被下載。此外,我們也可以做配置,只取由 Git LFS 管理的某些特定?件的實際內(nèi)容,?對于其他由 Git LFS 管理的?件則只保留?件指針,從?節(jié)省帶寬,加快克隆倉庫的速度;也可以配置?次獲取??件的最近版本,從?能?便地檢查??件的近期變動。
          解決.git目錄過大問題

          1. 問題描述

          ?

          「發(fā)現(xiàn)問題,然后判斷病因!」

          ?
          • 我們使用過 Git 的同學都知道,隨著代碼的更新迭代,倉庫的體積越來越大。如果操作和使用都比較恰當?shù)那闆r下,倉庫體積不會突增的。但是如果使用不恰當?shù)脑挘蔷头浅擂瘟?,比如我們下面要說的這種情況,.git 這個隱藏目錄特別大。

          • 雖然 .git 這個隱藏目錄并不算在代碼體積之后,但是我們拉代碼的時候,是需要拉下來的,因為里面包含之前的提交記錄等信息。這就會導致,原本平和的心情變得焦躁了,因為下載速度變的很慢。

          ???du?-d?1?-h
          680M????./.git
          500K????./misc
          ?68K????./docker
          ...
          1.1G????.

          2. 原因解釋

          ?

          「需要對 Git 的工作原理要有一定的理解,才可以明白!」

          ?
          • 當我們使用 git addgit commit 命令的過程中,Git 不知不覺就會幫我們創(chuàng)建出來了 blob 文件對象,然后更新 index 索引,再然后創(chuàng)建 tree 對象,最后創(chuàng)建出了 commit 對象。這些 commit 對象指向了頂層 tree 對象以及先前的 commit 對象。

          • 而上述創(chuàng)建出來的對象,都以文件的方式保存在 .git/objects 目錄下。所以,當我們在使用的過程中,提交了一個體積特別大的文件,就會被 Git 追蹤記錄在 .git/objects 文件夾下面。

          • 此時,如果我們再次刪除這個體積特別大的文件,其實 Git 只會記錄了我們刪除的這個操作,但并不會把文件從 .git 文件夾下面真正的刪除,即 .git 文件夾完全不會變小。


          3. 解決方法

          ?

          「根本上的解決方式就是,及時使用 lfs 來追蹤記錄大文件!」

          ?
          • 「[方法一] 重建倉庫」

          重建倉庫的這種做法,算是一種比較一勞永逸且相對而言比較簡單的方式。既然現(xiàn)在的倉庫已經(jīng)讓我們無法忍受,與其這樣,還不是刪除重建來的爽快。但是,這種做法一般情況下,都是不可行,除非是自己的本地項目。

          • 「[方法二] 刪除大文件」

          第二種做法就是,直接找到 .git 目錄下的大文件,將其刪除掉,之后推送到遠程代碼庫里面。這樣做的前提是,刪除所有其他分支,保留 master 或者 main 分支。這里需要注意的是,操作有風險,后果請自負。

          #?查找大文件
          $?git?verify-pack?-v?.git/objects/pack/*.idx
          12235d...dewaaaa34?tree???135?137?144088922
          a453ab...34se212qz?blob???3695898?695871?144734158
          ......

          #?篩除前五個且保留第一列
          $?git?verify-pack?\
          ????-v?.git/objects/pack/*.idx?|?\
          ????sort?-k?3?-n?|?tail?-5?|?awk?'{print$1}'
          12q626a...23a3
          2z32ax1...azfd
          ......

          #?查找出最大的5個文件和對應Commit信息
          $?git?rev-list?--objects?--all?|?\
          ????grep?"$(git?verify-pack?-v?.git/objects/pack/*.idx?|?\
          ????sort?-k?3?-n?|?tail?-5?|?awk?'{print$1}')
          "

          91266a...sdfa3????data/xxx.pkl
          232ax1...acafd????data/yyy.pkl
          ......

          #?rev-list:????列出Git倉庫中的所有提交記錄
          #?--objects:???列出該提交涉及的所有文件ID
          #?--all:???????所有分支的提交(位于/refs下的所有引用)
          #?verify-pack:?顯示已打包的內(nèi)容(找大文件)
          #?將其刪除掉
          $?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:?指定后面命令進行刪除
          #?--all:??????????所有分支的提交(位于/refs下的所有引用)
          #?強制推送
          $?git?push?--force?--all

          #?徹底清除
          $?rm?-rf?.git/refs/original/
          $?git?reflog?expire?--expire=now?--all
          $?git?gc?--prune=now
          • 「[方法三] 使用工具清理」

          幸好,Github 上面有一個叫做“git-filter-branch”https://github.com/rtyley/bfg-repo-cleaner的工具,就是幫助我們來清理大文件對象的,其使用 Scala 語言進行編寫的,且操作起來也十分方便。只需要簡單幾步,就可以完成我們的需要。最新版需要確保本地的 javaJdk8+。

          #?下載封裝好的jar包
          $?wget?https://repo1.maven.org/maven2/com/madgag/bfg/1.13.0/bfg-1.13.0.jar

          #?克隆的時候需要--mirror參數(shù)
          $?git?clone?--mirror?git://example.com/big-repo.git

          #?運行BFG來清理存儲庫
          $?java?-jar?bfg.jar?--strip-blobs-bigger-than?100M?big-repo.git

          #?去除臟數(shù)據(jù)
          $?cd?big-repo.git
          $?git?reflog?expire?--expire=now?--all
          $?git?gc?--prune=now?--aggressive

          #?推送上去
          #?此推將更新遠程服務器上的所有refs分支
          $?git?push
          #?刪除所有的名為'id_dsa'或'id_rsa'的文件
          $?java?-jar?bfg.jar?--delete-files?id_{dsa,rsa}??my-repo.git

          #?刪除所有大于50M的文件
          $?java?-jar?bfg.jar?--strip-blobs-bigger-than?50M??my-repo.git

          #?刪除文件夾下所有的文件
          $?java?-jar?bfg.jar?--delete-folders?doc??my-repo.git
          • 「[方法四] 使用 migrate 命令優(yōu)化 .git 目錄」

          遷移已有的 git 倉庫,使? git lfs 來進行管理。重寫歷史后的提交需執(zhí)? git commit --force,請確認在本地的操作合適?誤后再進?提交。如有遷移? git lfs 前的倉庫有多份拷?,其他拷?可能需要執(zhí)? git reset --hard origin/master 來重置其本地的分?,注意執(zhí)? git reset --hard 命令將會丟失本地的改動。

          編號命令含義解釋
          1git lfs migrate用來將當前已經(jīng)被 GIT 儲存庫(.git)保存的文件以 LFS 文件的形式保存
          #?重寫master分?
          #?將歷史提交(指的是.git目錄)中的*.zip都?lfs進?管理
          $?git?lfs?migrate?import?--include-ref=master?--include="*.zip"

          #?重寫所有分?及標簽
          #?將歷史提交(指的是.git目錄)中的*.rar,*.zip都?lfs進?管理
          $?git?lfs?migrate?import?--everything?--include="*.rar,*.zip"

          #?切換后需要把切換之后的本地分支提交到遠程倉庫了,需要手動push更新遠程倉庫中的各個分支
          $?git?lfs?push?--force

          #?切換成功后,GIT倉庫的大小可能并沒有變化
          #?主要原因可能是之前的提交還在,因此需要做一些清理工作
          #?如果不是歷史記錄非常重要的倉庫,建議不要像上述這么做,而是重新建立一個新的倉庫
          $?git?reflog?expire?--expire-unreachable=now?--all
          $?git?gc?--prune=now

          4. 總結教訓

          ?

          「勤于思考,必中頭榜!」

          ?

          比較好的避免上述問題的出現(xiàn),就是及時使用 lfs 來追蹤、記錄和管理大文件。這樣大文件既不會污染我們的 .git 目錄,也可以讓我們更方便的使用。

          #?1.開啟lfs功能
          $?git?lfs?install

          #?2.追蹤所有后綴名為“.psd”的文件
          $?git?lfs?track?"*.iso"

          #?3.追蹤單個文件
          git?lfs?track?"logo.png"

          #?4.提交存儲信息文件
          $?git?add?.gitattributes

          #?5.提交并推送到GitHub倉庫
          $?git?add?.
          $?git?commit?-m?"Add?some?files"
          $?git?push?origin?master

          同時,還有一個方法,就是靈活使用 .gitignore 文件,及時排除我們倉庫不需要的特殊目錄或者文件,從而不會讓不應該存在的文件,出現(xiàn)在我們的代碼倉庫里面。

          .DS_Store
          node_modules
          /dist

          *.zip
          *.tar.gz

          5. 參考鏈接

          ?

          「送人玫瑰,手有余香!」

          ?
          • bfg-repo-cleaner:https://rtyley.github.io/bfg-repo-cleaner/
          • 尋找并刪除 Git 記錄中的大文件:https://harttle.land/2016/03/22/purge-large-files-in-gitrepo.html

          瀏覽 85
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人无码高清在线 | 国产精品久久久久久亚洲毛片 | 人人色视频 | 中国10一14毛片 | 豆花精品在线视频 |