簡體   English   中英

Git:如何將子模塊推送到遠程存儲庫?

[英]Git: how to push submodule to a remote repository?

我使用git來跟蹤我正在處理的網站。 我在我的機器上工作並將提交推送到按照本指南配置的遠程服務器: 使用Git管理網站

上周我嘗試使用Git子模塊來管理一些第三方庫,今天我嘗試推送到服務器,發現在服務器中所有子模塊目錄都是空的。

我嘗試添加並提交對本地子模塊的更改,實際上git status表示工作目錄是干凈的。

我能做什么?

子模塊的意思是它們是存儲庫中的git存儲庫,而父存儲庫只知道應該在子模塊中檢出哪些提交 - 它對內容一無所知。 因此,只知道未填充子模塊的父項目的服務器自然會在其中看不到任何內容。

您需要在某個時刻初始化服務器上​​的子模塊。 看起來你的工作樹與你的GIT_WORK_TREE=/path/to/whatever git submodule update --init分開了一個設置,所以就像那個git checkout -f ,你需要適應它: GIT_WORK_TREE=/path/to/whatever git submodule update --init 之后,當你的鈎子在推送后運行git checkout -f ,它還需要運行git submodule update (再次適當地設置工作樹)。

但它比這更復雜。 您沒有提供有關子模塊來自何處的任何信息,但子模塊知道其來源,就像您的存儲庫一樣。 初始化一個時,它會嘗試從該原點進行克隆,並且通常需要從該原點進行更新。 如果我懷疑,您的第三方庫的來源是公共的,您沒有推送訪問權限,那么您將不得不為子模塊設置自己的中央存儲庫。 當您在其中一個子模塊中提交時,您將推送到其中央存儲庫, 然后推送父項目,這樣當它嘗試更新其他地方的子模塊時,它就能夠獲取它們。

所以,回顧一下,工作流程是這樣的:

  • 提交第三方子模塊(或它的獨立克隆)
  • 將第三方庫推送到其中央存儲庫
  • 在父repo中添加子模塊(讓它知道新的提交)並提交
  • 將父項目推送到其中央倉庫
  • parent的中央repo hook檢查到你的服務器,並在那里更新子模塊

正如Jefromi指出的那樣,你的子模塊需要一個“遙控器”才能被推動。

我想你缺少的一步就是這樣

submodule-dir/$ git remote add origin <where to push submodule>

這里有一個簡單的例子: Git:推送一個新的子模塊

子模塊實際上是一個單獨的倉庫,它被推送到另一個遠程倉庫。 所以基本上當你更改子模塊中的某些東西時,你需要在你的子模塊的工作空間中推動它。 此外,在推送到子模塊后,您還需要推送主項目。

這是一些例子

我遇到了類似的問題:PC(A)中的repo克隆與外部網站中的遠程控制器我希望在同一網絡中的另一台PC(B)中克隆我的本地存儲庫,我可以推送我的更改(通過ssh)並進行一些測試(我的一些回歸測試需要很長時間),這樣我就可以繼續在不同的分支上工作(如果需要的話)。 (A)中的回購有一個子模塊。

我在(B)中創建了裸倉庫:

mkdir /path/to/bare_git && cd /path/to/bare_git
git --bare init

並將其添加為我在(A)的本地倉庫中的新遙控器:

git add remote name_of_B_repo ssh://user@host/path/to/bare_git/

並將(A)中的本地倉庫(可能還有尚未公開的變更)推送到我的ssh倉庫:

git push name_of_B_repo branch_to_push

在此之后,我從內部克隆我的裸倉庫(B):

mkdir /path/to/B_clone && cd /path/to/B_clone
git clone /path/to/bare_git
git submodule update --remote

我可以看到我的子模塊沒有被包括在內。

解決方案1 :如果您沒有興趣測試/更改子模塊的內容,但是您需要它來進行測試,那么您可以直接在(B)克隆的.git / config中包含外部網站鏈接:

[submodule]
        url = http://submodule_external_website_url

然后,只需更新您的子模塊:

git submodule update --remote

解決方案2 :如果您有興趣更改(A)中子模塊的內容並將其發送到(B),首先需要將(B)中的ssh repo添加到本地(A)子模塊倉庫中作為新的遠程:

cd /path/to/submodule
git add remote name_of_B_repo ssh://user@host/path/to/bare_git/

推動您的更改:

cd /path/to/main_A_local_repo
git submodule foreach git push name_of_B_repo branch_to_push

將子模塊本地路徑添加到(B)中克隆repo的.git / config文件中:

[submodule]
        url = /path/to/bare_git

並像以前一樣更新您的模塊:

git submodule update --remote

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM