日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

git 子模块在项目中的使用

發(fā)布時(shí)間:2024/8/23 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 git 子模块在项目中的使用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在公司的項(xiàng)目中, 經(jīng)常會(huì)遇到一些公共的內(nèi)容, 多個(gè)項(xiàng)目中間通用的, 不可能每次都將整個(gè)代碼復(fù)制一遍, 遇到這種情況有很多不同的解決方案, 一般來(lái)說(shuō), 項(xiàng)目是通過(guò) git 來(lái)管理的, 巧了, git 也同樣支持子模塊.

創(chuàng)建子模塊

git submodule add git@gitee.com:hujingnb/submodule_son.git submodule_son

指定子項(xiàng)目地址, 后面的參數(shù)可以更改子模塊的路徑. 這步操作可給當(dāng)前項(xiàng)目添加一個(gè)子模塊.

克隆新項(xiàng)目

當(dāng)團(tuán)隊(duì)加入新人時(shí), 需要將原項(xiàng)目 down 下來(lái). 操作如下:

  • git clone xxxx.git?(克隆項(xiàng)目)
  • git submodule init?(子模塊初始化)
  • git submodule update?(更新子模塊)

當(dāng)然, 最好一條命令就能搞定:

git clone --recursive xxxx.git

子模塊操作

對(duì)于子模塊的更新,提交等操作, 進(jìn)入對(duì)應(yīng)路徑, 正常操作即可.

問(wèn)題

以上對(duì)于子模塊的使用, 網(wǎng)上有各種教程, 在此不再贅述.

而我在使用中遇到的問(wèn)題是這樣的: 公司的代碼庫(kù)分為測(cè)試環(huán)境與生產(chǎn)環(huán)境兩個(gè)分支:?dev,?master. 由于git對(duì)于子模塊的管理并不是基于分支, 而是基于commit id的. 這對(duì)于引用第三方庫(kù)是可以理解的, 畢竟需要一個(gè)穩(wěn)定的版本嘛. 但是對(duì)于公司這種需要頻繁更新的項(xiàng)目, 就有些混亂了.

舉個(gè)例子, 經(jīng)常會(huì)有多個(gè)任務(wù)并行執(zhí)行的情況, 如果有些任務(wù)后開(kāi)發(fā), 又需要先行合到生產(chǎn)環(huán)境, 可能會(huì)提交了較新的commit id上去. 故而并不像分支管理一樣, 直接拉取分支即可. 這又該如何是好呢?

不同分支

對(duì)于這個(gè)問(wèn)題, 我想了很久. 要想實(shí)現(xiàn)分支的正常管理, 還是應(yīng)該不同環(huán)境對(duì)應(yīng)不同的分支, 但是子模塊只能指定commit id, 不能對(duì)應(yīng)分支. 如此一來(lái), 那就只有一個(gè)辦法, 不同分支指定不同的commit id, 這也是我能想到的最清楚,最符合流程的方式了. 也就是說(shuō), 子模塊也切為dev,?master兩個(gè)分支, 也正常進(jìn)行合并. 而對(duì)于父項(xiàng)目來(lái)說(shuō), 將子項(xiàng)目切換到不同的分支, 每次提交之后, 將子模塊分支拉取到最新, 然后將commit id提上去, 不就解決了么...

流程如下:

  • 切換子模塊分支:?git submodule foreach git checkout master
  • 將子模塊分支拉取到最新:?git submodule foreach git pull
  • 提交commit id:?git add .; git commit -m ""; git push;
  • 然后將以上操作寫(xiě)到腳本中, 每次自動(dòng)化拉取最新代碼即可.

    如此一來(lái), 子模塊的管理就和正常流程一致了, 將不同環(huán)境代碼合并到不同分支, 分別拉取對(duì)應(yīng)分支代碼即可.

    此方法是我自己想到的, 是否可行還有待驗(yàn)證

    子模塊沖突

    既然子模塊是根據(jù)commit id進(jìn)行管理的, 那么當(dāng)不同的人提交了不同的commit id上來(lái)的時(shí)候, 就很有可能存在沖突.

    先說(shuō)一下我是如何制造沖突的:

  • 父項(xiàng)目與子模塊分別拉取分支:?master_tmp
  • 父項(xiàng)目與子模塊切回master分支
  • 子模塊修改文件并提交, 父項(xiàng)目更新commit id
  • 此時(shí)父子都回到master_tmp分支, 修改同一行內(nèi)容,并提交commit id
  • 將父項(xiàng)目master_tmp合并到master分支
  • 此時(shí)沖突如下:

    對(duì)于沒(méi)有接觸過(guò)子模塊的我來(lái)說(shuō), 有如下問(wèn)題:

  • 這兩個(gè)commit id我怎么知道哪個(gè)是最新的? 總不能一個(gè)一個(gè)去找吧
  • submodule_son?連個(gè)文件都沒(méi)有, 我該怎么解決這個(gè)沖突???
  • 如此該如何解決呢? 很明顯, 這個(gè)沖突是子項(xiàng)目的沖突, 所以要進(jìn)入子項(xiàng)目解決. 主要的思想當(dāng)然還是解決分支之間的沖突.

  • 將子模塊分支切到master:?git checkout master
  • 將子模塊產(chǎn)生沖突的提交新建一個(gè)分支:?git branch merge_tmp a8f5f8c
  • 將子項(xiàng)目合并到master:?git merge merge_tmp
  • 解決子項(xiàng)目的沖突
  • 再次回來(lái)查看, 沖突解決, 提交即可
  • 子模塊沖突解決完畢后, 再回來(lái)查看:

    此時(shí)沖突已經(jīng)解決完成, 提交即可.

    同理, 當(dāng)你不方便操作master分支的時(shí)候, 將master合并到你自己的分支, 然后解決沖突, 是一樣的.

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的git 子模块在项目中的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。