對於每一個開發者來說,git 倉庫是咱們幾乎天天都要接觸的東西,可是實際上大多數的 git 倉庫管理都是很是隨性且不規範的,在某些狀況下這樣作並無太大的問題,可是當協做成員逐漸增多、倉庫職責逐步擴展時,不少本來不規範的小問題會被逐漸放大乃至產生一些極爲嚴重的問題。筆者所在的飛冰(ICE)團隊在 2018 年 2 月開源了 alibaba/ice
這個倉庫,通過不到一年的時間終於在 2018 年底達到了 1w+ stars 的里程碑,在管理這個倉庫以及運營社區的過程當中咱們積累了一些或大或小的最佳實踐,但願能分享出來幫助到其餘開源或者沒開源的 git 倉庫管理者。注:對於 git 的操做,筆者自知還處於一個比較初級的階段,若有錯誤的地方還望指出。前端
當咱們說管理倉庫的時候,其實面向的不是一個單一的倉庫,而是一個產品、一個項目甚至一個業務,這背後可能會有多個倉庫也可能只有一個倉庫,所以在前期的規劃上要儘可能梳理清楚,核心避免兩個誤區:git
這個方案多是多數人的直覺反應,這種方式會讓產品對應的倉庫數快速增多,致使長期管理成本陡增:github
實際上,飛冰(ICE)原先在內部的時候,咱們開發了不少業務組件,每一個業務組件都是一個單獨倉庫,而後最近在作統一升級(工具、規範或者其餘變動致使)的時候給筆者我的帶來很是大的困擾:npm
所以,咱們須要避免過於零散的管理方式,而後結合實際場景作適當的聚合。ruby
在前端社區裏,隨着 lerna 這個批量發佈包工具的出現,這種方式愈來愈流行,一些很是熱門的項目好比 babel、React、jest 等都逐漸遷移到這個方案。先拋開 lerna 這個工具提供的能力,這種聚合式的管理方式給倉庫管理者節省了不少成本,好比:babel
可是在實踐這種方式的時候有可能會走偏,仍是以筆者所在的 ICE 團隊作反面教材,踩了誤區 1 的坑以後,在作開源版本的時候咱們過段把全部包都放到同一個倉庫,而後經過目錄結構來保證職責清晰,這個方式也一樣如上面所提到的給咱們的管理帶來了諸多便利,但在經歷了一年的迭代以後目前也遇到了一些問題:app
所以咱們推薦「在方案 2 的基礎上按照職責再作一層拆分」,結合 alibaba/ice
這個倉庫,咱們後續會把 React 物料代碼、Vue 物料代碼、Angular 物料代碼分別拆出去成爲三個獨立倉庫,一方面下降主倉庫的體積,另外一方面Vue 的貢獻者不須要關心其餘對他沒有意義的文件目錄。異步
筆者曾經有幸參與過淘寶前端團隊的代碼規範制定以及相關工具落地,所以深知規範之於團隊的重要性,同時也有一些制定規範的原則:(1) 規範首先保證正確,其次提高質量;(2) 規範不能過多影響到效率(二者的權衡須要結合實際場景)。如下就是咱們目前在遵循的一些規範:工具
根據倉庫狀況設定保護分支,禁止直接往保護分支提交代碼,在很是特殊的狀況下 admin 帳戶能夠繞過。測試
好的 commit message 可讓人快速瞭解代碼意圖,加速 review 進程,將來對於整個代碼倉庫的歷史追溯也會更加方便,關於這一點社區有足夠多的規範能夠參考,此處再也不一一贅述,有興趣能夠參考末尾的參考連接。
github 默認提供了三種合併 PR 的方式,關於三種方式的區別能夠參考文末的相關連接,咱們認爲大多數狀況應該選擇 Squash and merge,由於 squash 會將當前 PR 的多個 commit 合併,讓整個提交歷史更加乾淨清晰,可是在將上文提到的 release 分支合併到 master 時,是否應該將每一個功能點的 commit 合併成一個 release commit,目前咱們尚未思考清楚,但願能獲得一些建議或者指導。同時在合併 PR 的時候 Reviewer 有責任從新編寫 commit message 以保證語義更加準確。
這裏簡單追溯一點歷史:在最先期的時候,github 尚未提供 squash merge 的方式,當咱們向開源倉庫提交一個 PR 時,在倉庫做者 review 完成以後通常會要求提交者將 commit 合併,所以不少人都有谷歌過「如何合併 commit」這樣的關鍵詞,而現在只須要點一下按鈕便可,這也是工具對效率提高的一個體現。
對於管理工具包的同窗,都應該熟悉而且遵循 Semver 規範(語義化版本),這是原則,在此基礎上須要遵循如下規範:
npm publish --tag beta
發佈,不少同窗包含筆者本人常常會忘記 --tag beta
,不知道有沒有更加有效的方式約束?npm publish
發佈,發佈以後執行 tnpm sync
同步內部版本ice-scripts/1.0.2
結合曾經在淘寶前端團隊推進的規範落地以及當下在 ICE 團隊制定的規範,兩點結論可供參考:
上文說的一些工具包的發版,假設我有一個工具包 ice-scripts 在 1.6.5 的基礎發佈了一個 break change 的版本 2.0.0,正常狀況下咱們確定是在 master 分支(2.0.0 的代碼)的基礎上逐步迭代,但 1.x 的版本可能還有用戶使用,當咱們須要修復 1.x 的一個 bug 時如何去作?這裏推薦一個流程:
ice-scripts/1.6.5
切出一個 stable/ice-scripts-1.x
的分支(幸好以前打了 tag,不然要找到對應的 commit 仍是有點工做量的)stable/ice-scripts-1.x
設爲保護分支,能夠理解爲 1.x 版本的 master 分支stable/ice-scripts-1.x
切出新分支 ice-scripts-1.x/fix-bar
,而後修改代碼提交 PR 到 stable/ice-scripts-1.x
分支上stable/ice-scripts-1.x
分支上進行發佈運營社區的過程必定須要頻繁面對用戶的疑問,如何在知足用戶的同時又能保證自身投入不影響到正常工具顯得極爲重要了,對於技術產品,根據面向用戶羣體的不一樣目前兩種主流答疑方式:
答疑這塊目前總體上仍是佔用了太多時間,這塊也一直處於探索階段:
ICE 目前總體的 issue 管理作的很差,筆者也是近期開始治理這塊,一些建議僅供參考:
ICE 團隊目前維護着 5 個釘釘答疑羣(每一個 1000 人)以及技術論壇的官方賬號,但總體活躍度都比較通常,目前不管是精力上的投入仍是運營產品的經驗都比較缺失,但願能獲得一些建議或者支持。
github 上有不少方便的機器人(or App?),這裏推薦我的以爲比較有用的兩個機器人:
其餘有趣的機器人歡迎推薦。