早先,我利用 VSTS 來自動建置我的一個 GitHub repo,設定完成後,每當我推送任何修改至遠端主機的 develop branch,VSTS 都能夠成功建置,直到我在那個 repo 裡面加入了 submodule......
GitHub 子模組與 VSTS 建置
如果要在 repo A 的專案裡面引用 repo B 的程式碼,可以用 git submodule add 指令來把 repo B 以子模組(submodule)的形式加入到 repo A:
例如:
上述指令可將 GitHub 的 HuanlinLib repo 以子模組的形式掛在 \work\ProjectA\Source\HuanlinLib 目錄下。
也就是說,本機資料夾 /work/ProjectA 裡面是主專案的 repo 副本,而 /work/ProjectA/Source/HuanlinLib 會有另一個 repo 的副本。如果我修改了子模組裡面的檔案,也是利用 commit 和 push 來將變動推送至遠端主機,就跟操作一般的 repo 一樣。
另一方面,我還必須在 VSTS 的專案設定啟用「Checkout submodules」選項,以便在每次建置專案時自動從 GitHub 上面把子模組的程式碼一併拉下來:
背景大致介紹完畢,接著說明問題。
問題
在我用前述指令加入子模組之後,父層 repo(即上例的 ProjectA)的根目錄底下會產生一個名為 .gitmodule 的檔案,內容如下:
接著,開始在父層 repo 的專案裡面改東改西,然後 commit、push。
沒多久,Windows 桌面的右下角就浮出一個通知,告訴我 VSTS 建置失敗:
打開瀏覽器,登入我的 visualstudio.com 入口來查看詳細的建置紀錄。我看到這個錯誤訊息:
##[command]git submodule sync --recursive
##[command]git -c http.https://github.com.extraheader="AUTHORIZATION: basic ********" submodule update --init --force --recursive
fatal: No url found for submodule path 'Source/HuanlinLib' in .gitmodules
##[error]Git submodule update failed with exit code: 128
底下是截圖:
上網爬了一些文,試了一些方法,結果都沒用。似乎沒有人碰到跟我一樣的狀況,就這樣一兩個鐘頭過去了......
解法
在上網爬文的過程中,腦袋曾閃過一個念頭:該不會是那個 .gitmodule 檔案裡面的路徑名稱使用兩個反斜線的緣故吧?
轉念立刻反駁自己:「應該不會吧,那個檔案是我用 git 指令產生的,完全沒有手動改過啊。」
就在所有上網爬文找到的方法都無效之後,抱著姑且一試的想法,把 .gitmodule 裡面的兩個反斜線都改成一個斜線:
然後,VSTS 竟然可以成功取出子模組的程式碼檔案,並成功建置專案了。
兩個反斜線的代價 😵
GitHub 子模組與 VSTS 建置
如果要在 repo A 的專案裡面引用 repo B 的程式碼,可以用 git submodule add 指令來把 repo B 以子模組(submodule)的形式加入到 repo A:
git submodule add [repo A 的 url] [本機目錄名稱]
例如:
cd \work\ProjectA git submodule add https://github.com/huanlin/HuanlinLib.git Source\HuanlinLib
上述指令可將 GitHub 的 HuanlinLib repo 以子模組的形式掛在 \work\ProjectA\Source\HuanlinLib 目錄下。
也就是說,本機資料夾 /work/ProjectA 裡面是主專案的 repo 副本,而 /work/ProjectA/Source/HuanlinLib 會有另一個 repo 的副本。如果我修改了子模組裡面的檔案,也是利用 commit 和 push 來將變動推送至遠端主機,就跟操作一般的 repo 一樣。
另一方面,我還必須在 VSTS 的專案設定啟用「Checkout submodules」選項,以便在每次建置專案時自動從 GitHub 上面把子模組的程式碼一併拉下來:
背景大致介紹完畢,接著說明問題。
問題
在我用前述指令加入子模組之後,父層 repo(即上例的 ProjectA)的根目錄底下會產生一個名為 .gitmodule 的檔案,內容如下:
[submodule "Source\\HuanlinLib"] path = Source\\HuanlinLib url = https://github.com/huanlin/HuanlinLib.git
接著,開始在父層 repo 的專案裡面改東改西,然後 commit、push。
沒多久,Windows 桌面的右下角就浮出一個通知,告訴我 VSTS 建置失敗:
打開瀏覽器,登入我的 visualstudio.com 入口來查看詳細的建置紀錄。我看到這個錯誤訊息:
##[command]git submodule sync --recursive
##[command]git -c http.https://github.com.extraheader="AUTHORIZATION: basic ********" submodule update --init --force --recursive
fatal: No url found for submodule path 'Source/HuanlinLib' in .gitmodules
##[error]Git submodule update failed with exit code: 128
底下是截圖:
上網爬了一些文,試了一些方法,結果都沒用。似乎沒有人碰到跟我一樣的狀況,就這樣一兩個鐘頭過去了......
解法
在上網爬文的過程中,腦袋曾閃過一個念頭:該不會是那個 .gitmodule 檔案裡面的路徑名稱使用兩個反斜線的緣故吧?
轉念立刻反駁自己:「應該不會吧,那個檔案是我用 git 指令產生的,完全沒有手動改過啊。」
就在所有上網爬文找到的方法都無效之後,抱著姑且一試的想法,把 .gitmodule 裡面的兩個反斜線都改成一個斜線:
[submodule "Source/HuanlinLib"] path = Source/HuanlinLib url = https://github.com/huanlin/HuanlinLib.git
然後,VSTS 竟然可以成功取出子模組的程式碼檔案,並成功建置專案了。
兩個反斜線的代價 😵
沒有留言: