主頁 > 軟體工程 > 為什么我的代碼庫那么大?聊聊Git使用壞習慣

為什么我的代碼庫那么大?聊聊Git使用壞習慣

2023-04-16 08:10:42 軟體工程

本文作者用幽默又真實的文字總結了開發者日常作業中遇到的那些事兒,

說點真實的

眾所周知啊??,很多公司的度量系統可以展示你提交了多少次commit,以及每一次提交包含多少行代碼,
搞得部分兄弟一天可勁 add commit push,他那一個變更發上線,你打開Git Log,好家伙那一大串都是他,加加減減縫縫補補,最后一共改了20行代碼,硬是刷出了200行的功德,
一串Git commit message如下:
  • AoneBuild Merge feautre/777_平臺賦能牛逼新特性 to master
  • Fix老板CR中建議
  • fix again
  • fix2
  • fix
  • save
  • update
  • new feature

典!典中典!

仿佛能看到他信心滿滿,直接發預發!一重繪, 哦豁,白屏! 
哦忘了傳這個了,fix,push,部署,玩手機,抬頭一重繪,哦豁,白屏!

圖片

好活!
下次 OC 再搞脫口秀我提個節目!隨機找幾個這種上去對著這種 git log 現場即興模仿表演,
他們歡快而自信的時候,以及受痛苦和絕望所折磨的時候,生活中的痛苦和壓迫會像血汗一樣,一行行地全寫在了他們的Git Log里,
你們好不好奇, 一個代碼庫幾百個檔案,為啥能用一兩個G?小小一個系統,下個代碼都十幾分鐘?
部署和CI場景可以 depth=1 淺克隆加速
完全沒有意義的Git 提交歷史,極速膨脹的代碼庫大小,混亂的分支關系,正在壓死你的代碼庫和專案!
每一個程式員,在遇到一個可愛而熱心的代碼倉看門大爺前,都會隨意的對待自己的commit,因為大家都這么做,沒見過怎么best practice,所以就doesn't matter,
求求你們了!好好寫你的Git commit message!squash你的 fixfixfix!刪刪你已經沒用的分支!重構拆掉哪些超大檔案和幾萬行的類!
讓Git Log能做到寫清楚你到底改了啥!而不是你的草紙!
阿里很多資深Coder都是野生哆啦A夢,技能樹包括但不限于:
    1. 手里維護的代碼庫,托前人的福,一堆方法 JsonObject 出入參,他能如特工,手持密碼本相互通信,

       

       

    2. 系統日志print全是不帶id的sout,也能靠口袋里的見都沒見過的神奇道具和監控線條里波紋感應定位故障源頭,

       

       

    3. 一個代碼檔案3萬行,硬是一眼掃找出在哪兒再加個if else能5分鐘hotfix一下線上Bug,

       

      "線上bug!

      很急,來不及加單測了,幫忙過一下!

      "

    4. 對代碼系統機魂, 了如指掌,深諳取悅機魂之道,知道一些外人看來十分玄妙的獨特邏輯,掌握很多,“又不是不能用,只是你不會用,要這么這么就能用”的高級黑盒功能,

雖然兄弟們這么用Git “又不是不能用”,但是要我說 “那是你不會用”,“要這么這么用

到這里,聰明的小朋友就要問了,為啥幾百個檔案,為啥能用一兩個G呢?

Git的結構,圖文實體解說

眾所周知,Git 主要資料結構是一顆樹,在你的.git檔案夾里,結構是這樣的,
圖片
.git檔案內部結構
其中的 refs中保存有分支的資訊,
圖片
refs檔案內部結構
其中的  heads,本地分支,remotes,遠程分支(用git fetch更新), tags 不可變的版本指標,他們都是指向一個commit的指標,
圖片
master的內容物
比如 這里, master,就是一個commit id,
你可能注意到了,分支似乎不是一個分支一個檔案的,而是按/分割,當成檔案夾存盤的, 
比如feature是不是個分支?其實不是,假設 我新建一個名為 feature/newaCTO的分支,會在feature檔案夾里建一個newaCTO, 而不是直接新建一個feature/newaCTO,
小zips, linux檔案系統中,檔案與檔案夾是不能重名的, 
所以, 一旦誰建了一個叫做feature的分支,那么,在第一個小聰明刪掉他之前,就沒人能拉出任何feature/*的分支了,
分支是指向commit的指標,那讓我們更近一步, commit是啥呢?
圖片
master節點的詳情
這是一個merge 節點,和普通的commit節點不同,merge節點有兩個parent,
除此之外,有author和committer, author是作者,committer是提交人,在本地開發中,這兩者基本上是一樣的,注意,這里使用的,是gitConfig中的name 和 email,
這里parent指向的是另一個commit, 典型的樹狀資料結構,
那么Tree中有什么呢,
圖片
tree的結構
圖片
tree的詳情
可以看到展示了一個串列,與GIt Log中展示不同, Tree里其實包含了完整的檔案樹,樹的末端,指向一個檔案的oid,
串列中四個欄位分別是:
1、mode: 權限(chmod加的東西)
2、type:  型別,tree說明是檔案夾,blob則是檔案,大部分情況下就是代碼,也可能是圖片或其他檔案,
游戲團隊的代碼庫中就會包含很多美術素材圖片,
但是,Git不是檔案存盤系統,大檔案建議使用Git LFS技術,上傳OSS,Git僅管理檔案鏈接,
3、revision(oid):每當你提交commit時,你在這個commit中改動的檔案,git會把檔案的二進制資料加個資訊頭,然后算個hash,從而產生一個新的oid,然后這個commit會指向他,
所以,每當你commit,就算提交一行的改動,就會存整個檔案!(把代碼檔案,把類拆小點吧!不小心摸一下觸摸板,代碼就不知道去哪兒找了!)

然后你在每一改個兩行,就來個commit,存盤膨脹能不快么!

就不談沒維護好 gitIgonre,胡亂git add .把編譯檔案,摸魚刷的leetcode代碼或者其他奇奇怪怪的東西提交到Git中的情況了,
你可能會問,我這的檔案已經都刪掉了,為啥.git還有這么大?你們是不是有Bug?
因為Git會保存你歷史的所有版本!除非沒有一個任何一個commit指向這個blob,才會成為游離節點,在Git Gc的時候被處理掉,
當然Git也沒那么呆,是可以存增量的,
你在Git pc的時候會執行repack,repack會壓縮一部分到增量,不過一般沒人這么做,所以一般都是存了完整的離散檔案,
git gc是個好課題,存盤未來可能可以智能化的全自動gc,但是現在還不行,
因此!沒事刪刪分支!不小心提上來的大東西,得把對應的commit squash掉!
本地也可以允許git gc清理掉游離節點釋放空間,
我們并不是說要squash到一個變更一個commit,或者一個feature分支就一個commit,就像游戲存檔一樣,你可以在關中頻繁存檔,但是一大關打完了,你可以存一個然后把關中的存檔都刪了, 只留關鍵節點,這樣萬一你后悔選了這條命運線,可以讀檔重來,
這也是為什么那些大庫需要嚴格執行主干開發的原因,要是我們公司幾萬研發都用一個大庫,還都是用Git記日記的憨批, 我覺得我們會被迫在存盤技術上卷死OSS,壞了,順手把多版本云盤做成主營業務了,以后新人來了先發一塊移動硬碟好了, 微服務那么多系統,下代碼不得先下個半個月?

總結


一是git log和commit message是很重要的資訊來源,要保持整潔,用的正確,這個比發布檔案還清晰,
二是代碼存盤膨脹問題是很現實的, 隨著系統發展,代碼庫一個G你還能下下,再大點咋辦呢,
雖然我們存代碼不收費,說到這兒dataworks的兄弟們可能有同感, 不要錢就使勁造,狠角色拿git當oss用的都有幾個,,
主要影響的,還是可見的未來,不治理的話,clone代碼越來越慢,

Best practice:

1、Code Owner要建立 代碼庫統一的commit messgae 格式規范,例如 Feature(commit): write an article to introduce git
2、打完Boss,單測通過,squash掉你之前上廁所或者測驗時候的commit!化零為整但也不要矯枉過正!團隊應該根據自己業務情況探索合適commit的大小和規范,
3、重構掉“巨石類”!他們早就不夠內聚了!把能拆掉功能拆出來吧!我先替管存代碼的那個亙古和其他用這個類的開發先感謝你!
4、大檔案用Git LFS!
5、及時維護GitIgonre!誤提交的檔案一定要清理掉!
6、用心維護主干分支的Git Log!讓改動清晰可見!
7、刪掉沒用的分支!Later Equals Never!當機立斷舍離!
8、Readme要持續更新!怎么啟動,格式規范都可以寫在readme里!

Bad Practice: 

1、不要建 feature,release這兩個分支,雖然git沒有保留關鍵字,但是后人發現為啥建不出來分支的時候肯定會問候你的,
2、不要多分支并行開發的時候merge 來 merge去, git會臟合并 保持提交歷史干凈簡單!業務太復雜不行咱就上主干開發!不要每次代碼合并不符合預期就跑去找管代碼的同學說Git丟代碼,這種偵探服務的難度挺大的,在我建議按次收費!

 

作者|李子昂(雪蛋)

本文來自博客園,作者:古道輕風,轉載請注明原文鏈接:https://www.cnblogs.com/88223100/p/Talking-about-the-bad-habits-of-using-Git.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/550221.html

標籤:其他

上一篇:為什么要code review

下一篇:Uber SRE 實踐:運維大型分布式系統的一些心得

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more