簡體   English   中英

如何將 Git 子模塊添加到子目錄?

[英]How do I add Git submodule to a sub-directory?

我在~/.janus/中有一個 Git 倉庫,里面有一堆子模塊。 我想在~/.janus/snipmate-snippets/snippets/中添加一個子模塊,但是當我在snipmate-snippets目錄中運行git submodule add <git@github.com:...>時,我收到以下錯誤消息:

You need to run this command from the top level of the working tree.

所以問題是:如何將子模塊添加到snipmate-snippets目錄?

你進入~/.janus並運行:

git submodule add <git@github ...> snipmate-snippets/snippets/

如果您需要有關子模塊(或一般的 git)的更多信息, ProGit非常有用。

請注意,從git1.8.4 (2013 年 7 月)開始,您不必再返回根目錄。

 cd ~/.janus/snipmate-snippets
 git submodule add <git@github ...> snippets

Bouke Versteegh 評論說你不必使用/. ,就像在snippets/.中一樣: snippets就足夠了)

請參閱提交 091a6eb0feed820a43663ca63dc2bc0bb247bbae

子模塊:刪除頂層需求

使用新的rev-parse --prefix選項來處理給定子模塊命令的所有路徑,放棄從存儲庫的頂層運行它的要求。

由於相對子模塊 URL 的解釋取決於是否配置了“ remote.origin.url ”,因此當不在工作樹的頂層時,顯式阻止“ git submodule add ”中的相對 URL。

簽字人:John Keeping

取決於提交 12b9d32790b40bf3ea49134095619700191abf1f

這使得 ' git rev-parse ' 的行為就好像它是從存儲庫的指定子目錄調用的一樣,不同之處在於它打印的任何文件路徑都以工作樹頂部的完整路徑為前綴

這對於我們可能想要cd到工作樹頂部但需要處理用戶在命令行上給出的相對路徑的 shell 腳本很有用。

我有一個類似的問題,但是用 GUI 工具把自己畫到了一個角落。

我有一個包含一些文件的子項目,到目前為止我只是復制了一些文件,而不是檢查到他們自己的 git 存儲庫中。 我在子文件夾中創建了一個 repo,能夠提交、推送等就好了。 但是在父 repo 中,子文件夾沒有被視為子模塊,並且它的文件仍然被父 repo 跟蹤 - 不好。

為了擺脫這種混亂,我不得不告訴 Git 停止跟蹤子文件夾(不刪除文件):

proj> git rm -r --cached ./ui/jslib

然后我不得不告訴它那里有一個子模塊(如果 git 當前正在跟蹤任何東西,你就不能這樣做):

proj> git submodule add ./ui/jslib

更新

處理此問題的理想方法涉及更多步驟。 理想情況下,現有的 repo 被移出到它自己的目錄,沒有任何父 git 模塊,提交和推送,然后作為子模塊添加,如:

proj> git submodule add git@bitbucket.org:user/jslib.git ui/jslib

這會將 git repo 克隆為子模塊 - 這涉及標准克隆步驟,但也包括 git 代表您執行的其他幾個更晦澀的配置步驟,以使該子模塊工作。 最重要的區別是它在那里放置了一個簡單的 .git 文件,而不是 .git 目錄,該目錄包含對真實 git 目錄所在位置的路徑引用 - 通常在父項目根目錄 .git/modules/jslib 中。

如果你不以這種方式做事,它們會為你工作得很好,但是一旦你提交並推動父母,而另一個開發者去拉那個父母,你只會讓他們的生活變得更加艱難。 只要您在包含自己的 .git 目錄的目錄的子文件夾中有完整的 .git 目錄,他們就很難復制您在機器上的結構。

所以,move、push、git add submodule,是最干凈的選擇。

對於那些和我一樣喜歡手動編輯配置文件的人來說,添加(或修改)以下內容也可以解決問題。

.git/config (個人配置)

[submodule "cookbooks/apt"]
    url = https://github.com/opscode-cookbooks/apt

.gitmodules (提交的共享配置)

[submodule "cookbooks/apt"]
    path = cookbooks/apt
    url = https://github.com/opscode-cookbooks/apt

也看到這一點 - .gitmodules 和在 .git/config 中指定子模塊之間的區別?

單行 bash 腳本來幫助 Chris 在上面的回答,因為我把自己畫在一個角落里,以及使用 Vundle 更新我的 .vim 腳本。 DEST是包含您的子模塊的目錄的路徑。 在執行git rm -r $DEST之后執行此操作

DEST='path'; for file in `ls ${DEST}`; do git submodule add `grep url ${DEST}/${file}/.git/config|awk -F= '{print $2}'` ${DEST}/${file}; done

干杯

暫無
暫無

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

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