Git Subtree的使用

背景

項目A與項目B存在公用模塊讼昆,在項目A中修改Bug或增加新功能需要同步到項目B中,由于存在區(qū)別所以還不能完全copy

需求分析


  • 公用代碼遷移出去獨立的 git 倉庫,供其他項目共享代碼
  • 公用代碼原本是什么樣,抽取后也是什么樣,不像pod會對公用代碼進(jìn)行動態(tài)庫或靜態(tài)庫的包裝
  • 公用代碼庫是可以在不同項目間雙向同步的而不是單向同步
  • 保留公用代碼庫的歷史提交記錄與雙向同步記錄

雙向同步的栗子:A項目中依賴了子項目B岩齿,最方便的方式自然是直接在A項目里改B子項目對應(yīng)的目錄里的代碼,然后測試通過后苞俘,直接提交代碼盹沈,這個更改也提交到B子項目的 Git倉庫里。同時子項目B也可以單獨提交到 Git 倉庫,再在A項目里把子項目B的代碼update乞封。

現(xiàn)有方案


  • Git Submodule:這是Git官方以前的推薦方案
  • Git Subtree:從 Git 1.5.2 開始做裙,Git 新增并推薦使用這個功能來管理子項目
  • npm:node package manager,實際上不僅僅是 node 的包管理工具
  • composer:暫且認(rèn)為他是php版npm

雖然 npm肃晚,composer锚贱,maven 等更側(cè)重于包的依賴管理,以上幾個方案都是能夠做到在不同項目中同步同一塊代碼的关串,但沒法雙向同步拧廊,更適用于子項目代碼比較穩(wěn)定的情形。Git Submodule 和 Git Subtree 都是官方支持的功能晋修,不具有依賴管理的功能吧碾,但能滿足我們的要求。Git Subtree相對來說會更好一些 墓卦。

submodule 與 subtree對比

  • git submodule
    • 允許其他的倉庫指定以一個commit嵌入倉庫的子目錄
    • 倉庫 clone下來需要 initupdate
    • 會產(chǎn) .gitmodule 文件記錄 submodule 版本信息
    • git submodule 刪除起來比較費勁
  • git subtree
    • 避免以上問題
    • 管理和更新流程比較方便
    • git subtree合并子倉庫到項目中的子目錄倦春。不用像submodule那樣每次子項目修改了后要initupdate 。萬一哪次沒update就直接add ..gitmodulecommit上去就悲劇了
    • git v1.5.2以后建議使用git subtree

實施步驟


假設(shè)P1項目落剪、P2項目共用S項目
1. 關(guān)聯(lián)Subtree
'' cd P1項目的路徑
'' git subtree add --prefix=<S項目的相對路徑> <S項目git地址> <分支> --squash

解釋:--squash意思是把subtree的改動合并成一次commit睁本,這樣就不用拉取子項目完整的歷史記錄。--prefix之后的=等號也可以用空格忠怖。

2. 更新代碼
P1呢堰、P2項目里各種提交commit,其中有些commit會涉及到S目錄的更改凡泣,但是沒關(guān)系

3. 提交更改到子項目
'' cd P1項目的路徑
'' git subtree push --prefix=<S項目的相對路徑> <S項目git地址> <分支>
Git 會遍歷步驟2中所有的commit暮胧,從中找出針對S目錄的更改,然后把這些更改記錄提交到S項目的Git服務(wù)器上问麸,并保留步驟2中的相關(guān)S的提交記錄到S倉庫中

4. 更新子目錄
''cd P2項目的路徑
''git subtree pull --prefix=<S項目的相對路徑> <S項目git地址> <分支> --squash

拆分已有項目


需要從現(xiàn)有項目中抽取公共模塊單獨進(jìn)行g(shù)it管理
假設(shè)已有項目P抽取項目S
1. 提交日志分離
''cd P項目的路徑
''git subtree split -P <S項目的相對路徑> -b <臨時branch>
Git 會遍歷所有的commit,分離出與S項目的相對路徑相關(guān)的commit钞翔,并存入臨時branch中

2. 創(chuàng)建子repo
''mkdir <S項目新路徑>
''cd S項目新路徑
''git init
''git pull <P項目的路徑> <臨時branch>
''git remote add origin <S項目的git倉庫>
''git push origin -u master

3. 清理數(shù)據(jù)
''cd P項目的路徑
''git rm -rf <S項目的相對路徑>
''git commit -m '移除相應(yīng)模塊' # 提交刪除申請
''git branch -D <臨時branch> # 刪除臨時分支

4. 添加subtree
''git subtree add --prefix=<S項目的相對路徑> <S項目git地址> <分支> --squash
''git push origin master
執(zhí)行完第2步時严卖,對應(yīng)的目錄已經(jīng)剝離出來形成獨立的項目了。第3布轿,4步主要是把當(dāng)前項目的對應(yīng)的文件給刪除哮笆,重新在P項目建立Subtree

Tips

  • 相對路徑區(qū)別大小寫

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市汰扭,隨后出現(xiàn)的幾起案子稠肘,更是在濱河造成了極大的恐慌,老刑警劉巖萝毛,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件项阴,死亡現(xiàn)場離奇詭異,居然都是意外死亡笆包,警方通過查閱死者的電腦和手機(jī)环揽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門略荡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人歉胶,你說我怎么就攤上這事汛兜。” “怎么了通今?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵粥谬,是天一觀的道長。 經(jīng)常有香客問我辫塌,道長漏策,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任璃氢,我火速辦了婚禮哟玷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘一也。我一直安慰自己巢寡,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布椰苟。 她就那樣靜靜地躺著抑月,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舆蝴。 梳的紋絲不亂的頭發(fā)上谦絮,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機(jī)與錄音洁仗,去河邊找鬼层皱。 笑死,一個胖子當(dāng)著我的面吹牛赠潦,可吹牛的內(nèi)容都是我干的叫胖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼她奥,長吁一口氣:“原來是場噩夢啊……” “哼瓮增!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起哩俭,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绷跑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后凡资,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砸捏,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了带膜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吩谦。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖膝藕,靈堂內(nèi)的尸體忽然破棺而出式廷,到底是詐尸還是另有隱情,我是刑警寧澤芭挽,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布滑废,位于F島的核電站,受9級特大地震影響袜爪,放射性物質(zhì)發(fā)生泄漏蠕趁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一辛馆、第九天 我趴在偏房一處隱蔽的房頂上張望俺陋。 院中可真熱鬧,春花似錦昙篙、人聲如沸腊状。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缴挖。三九已至,卻和暖如春焚辅,著一層夾襖步出監(jiān)牢的瞬間映屋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工同蜻, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留棚点,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓湾蔓,卻偏偏與公主長得像瘫析,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子卵蛉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容