[精讚] [會員登入]
1238

git 中的 git(git 次模組)

版本控制引擎git 中的 git(git 次模組) / git inside git/ git submodule

分享此文連結 //n.sfs.tw/10532

分享連結 git 中的 git(git 次模組) @新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2022-12-27 11:20:44 最後編修
2017-01-02 09:23:24 By 張○○
 

自動目錄

有時寫的專案中還有引入另一個GIT專案,(不管是自己的其他專案或是別人的),簡易的作法是到該目錄下clone 一個進來:

簡單的來說:為了管理自己專案中的其他專案,就得用git submodule 這個功能:

--我的專案
         L 另一個專案

另一個專案可是自己或是別人的專案

但這樣的就會遇到2個問題:

1當另一個專案有更新時,我的專案還得另外到那個目錄作update(pull)的動作來確保更新。

2 在提交到伺服器時,另一個專案不會一併提交。當別人取回時,會得到一個空目錄。

因此為了維護我的專案中的別人的專案,得使用GIT提供的次模組功能 (submodule)

 

一、在我的專案中要加入一個別人的專案

例如我要拉ThirdParty-Project這個專案到我的目錄libs/third下,可下指令

git submodule add GIT來源 目標目錄

$ git submodule add https://github.com/user/ThirdParty-Project libs/third

這裡的目錄 libs/third 不能先建,git會自己建立。建立完git 會產生一個檔案 .gitmodules,內容大概是這樣:

[submodule "libs/third"]
        path = libs/third
        url = https://github.com/user/ThirdParty-Project

此檔會自動建立

同時次模組中的檔案也會被抓回來,未來在佈建或是更新時,次模組中的內容也會一併更新

範例

以smart 舉例來說,想在目錄public_html/application/libraries/smarty下放入smarty的github資源

$ git submodule add https://github.com/smarty-php/smarty.git public_html/application/libraries/smarty

查看結果

$ git submodule status
 a34ee98e214114370de417d147de6b2e5de4d3d6 public_html/application/libraries/smarty (v4.3.0-4-ga34ee98e)

有顯示內容表示次模組已建立,同時你的目錄下會出現一個隱藏檔 .gitmodules 長這樣

[submodule "public_html/application/libraries/smarty"]
    path = public_html/application/libraries/smarty
    url = https://github.com/smarty-php/smarty.git

 

二、我們把專案寫好發佈到伺服器

$ git commit -a -m "update_memo"

就算有次模組,自己的模組發布方法也沒有改變,-m後面是註解;-a是新增新的檔案

三、別人拉回我們的專案

$ git pull origin master
(origin:視各位的reposity設定,master:視各位的分枝而不同)

會發現別人的專案這個目錄是空目錄

$ cd libs/third
$ ls
一片空,別緊張,因為我們還沒有初始化這個次模組

四、初始化並更新拉回的專案

在你git的最上層目錄執行

$ git submodule init
$ git submodule update

這樣我們取回的複本,就能夠順利另外取得第三方的專案內容了。

 

移除次模組

雖然很常用到,但是沒有方便的移除方法[2][3],真的很爛。

1. 移除 .gitmodules 檔裡相關的內容

$ git add .gitmodules

$ git rm --cached public_html/application/libraries/smarty

  public_html/application/libraries/smarty 是 submodule_name

2. 移除 .gitmodules 中相關的設定

3. 移除 .git/config 檔裡相關的內容

4. 移除 .git/modules 中相關的目錄

5. 移除相關檔案

 

錯誤及排除

一、當建立次模組發生錯誤 'path/to/' already exists in the index[1]

這是因為你的目錄 path/to/已在git索引之中你需要將他先移除:

$ git rm -r  path/to

to本身是目錄,後面那個 '/'有加沒加沒關係。移除完重建

二、You need to run this command from the toplevel of the working tree.

進行次模組操作時,要到最上層目錄操作,也就是 .git/ 目錄存在的那層

只要到你原本下git init那層執行即可

參考資料

[1] https://codertw.com/%E4%BA%BA%E5%B7%A5%E6%99%BA%E6%85%A7/134110/

[2] https://www.atlassian.com/git/articles/core-concept-workflows-and-tips

[3] 5步删除git submodule https://segmentfault.com/a/1190000040338658


原文 2013-12-03 15:41:36

END

你可能感興趣的文章

中國台灣香港澳門各省市英文代碼 中台港澳英文代碼一覽表

XSBASE270 由 WinCE 改為 Linux 記錄 XSBASE270 改為 Linux 記錄,此篇只是留個記錄,

Chrome的遠端桌面(遠桌)使用 Chrome 具有遠端桌面(遠桌),可以輕易的讓你連到或被連到遠端電腦

「許功蓋」的字以及源由 有玩過電腦一段時間的人,都聽過這個人(有一天我才發現7年級的竟然都不認識這個

[Opera] 使用Opera來看youtube,可以獲得更加清晰的效果 Opera是大家不常聽見的瀏覽器,但使用Opera來看youtube,可以獲得更加清晰的效果。

台灣2023(民國112年)節慶國定假日 ics下載 找不到2023年的假日ics檔?沒關係,我自己做一個。

我有話要說

>>

限制:留言最高字數1000字。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

為什麼要買長達二十年的保單? 為什麼要買長達二十年的保單?找一個可以說服我買二十年保單的理由。

世紀帝國征服者新版本--被遺忘的帝國 世紀帝國征服者新版本--被遺忘的帝國 世紀二代的征服者是精典遊戲中的精典,aofe更好玩...

設計的工作絕不接受比價 拿買陽春麵的價格想買牛肉麵,寧願倒掉也不賣

[AS3] 變數型態 基本類型宣告 as3 有下列幾種基本類型:string, int, number, object, boolean, n

[MYSQL] 設定字串欄位的預設值 新增表格的時候,字串欄位給予預設空值;數字欄位給預設數值;日期欄位給空值。