我想在個人Git超級項目中更改Git子模塊的目錄名。 jquery
假設個人.gitmodules
文件中有如下條目: ios
[submodule ".emacs.d/vimpulse"] path = .emacs.d/vimpulse url = git://gitorious.org/vimpulse/vimpulse.git
我須要鍵入什麼來將.emacs.d/vimpulse
目錄移動到.emacs.d/vendor/vimpulse
而不先刪除它( 在這裏和這裏解釋),而後從新添加它。 git
Git真的須要子模塊標籤中的整個路徑 github
[submodule ".emacs.d/vimpulse"]
或者是否也能夠只存儲子項目的名稱? shell
[submodule "vimpulse"]
給定的解決方案對我不起做用,但相似的版本確實...... vim
這是一個克隆的存儲庫,所以子模塊git repos包含在頂級存儲庫.git目錄中。 全部陽離子都來自頂級存儲庫: url
編輯.gitmodules並更改相關子模塊的「path =」設置。 (無需更改標籤,也無需將此文件添加到索引中。) spa
編輯.git / modules / name / config並更改相關子模塊的「worktree =」設置 code
跑: 索引
mv submodule newpath/submodule git add -u git add newpath/submodule
我想知道若是存儲庫是原子的,或者相對的子模塊是否有所不一樣,在個人狀況下,它是相對的(子模塊/ .git是ref回到topproject / .git / modules / submodule)
在個人例子中,我想將一個子模塊從一個目錄移動到一個子目錄,例如「AFNetworking」 - >「ext / AFNetworking」。 這些是我遵循的步驟:
[core] worktree
行。 我從../../../AFNetworking
改成../../../../ext/AFNetworking
gitdir
。 我從../.git/modules/AFNetworking
改成../../git/modules/ext/AFNetworking
git add .gitmodules
git rm --cached AFNetworking
git submodule add -f <url> ext/AFNetworking
最後,我在git狀態中看到:
matt$ git status # On branch ios-master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: .gitmodules # renamed: AFNetworking -> ext/AFNetworking
瞧瞧。 上面的例子不會改變目錄深度,這會對任務的複雜性產生很大的影響,而且不會改變子模塊的名稱(這可能不是必需的,但我這樣作是爲了與若是我在那條路徑上添加了一個新模塊,就會發生。)
訣竅彷佛是要理解子模塊的.git
目錄如今保存在.git/modules
下的主存儲庫中,而且每一個子模塊都有一個指向它的.git
文件。 這是您如今須要的程序:
.git
文件,並修改它包含的路徑,使其指向主存儲庫的.git/modules
目錄中的正確目錄。 .git/modules
目錄,找到與子模塊對應的目錄。 config
文件,更新worktree
路徑,使其指向子模塊工做目錄的新位置。 .gitmodules
文件,更新子模塊工做目錄的路徑。 git add -u
git add <parent-of-new-submodule-directory>
(重要的是你要添加父節點 ,而不是子模塊目錄自己。) 幾點說明:
.gitmodules
和.git/config
的[submodule "submodule-name"]
行必須相互匹配,但不能與其餘任何內容相對應。 .git
目錄必須正確指向彼此。 .gitmodules
和.git/config
文件。 您只需添加一個新的子模塊,而後使用標準命令刪除舊的子模塊。 (應該防止.git中的任何意外錯誤)
示例設置:
mkdir foo; cd foo; git init; echo "readme" > README.md; git add README.md; git commit -m "First" ## add submodule git submodule add git://github.com/jquery/jquery.git git commit -m "Added jquery" ## </setup example>
檢查將'jquery'移動到'vendor / jquery / jquery':
oldPath="jquery" newPath="vendor/jquery/jquery" orginUrl=`git config --local --get submodule.${oldPath}.url` ## add new submodule mkdir -p `dirname "${newPath}"` git submodule add -- "${orginUrl}" "${newPath}" ## remove old submodule git config -f .git/config --remove-section "submodule.${oldPath}" git config -f .gitmodules --remove-section "submodule.${oldPath}" git rm --cached "${oldPath}" rm -rf "${oldPath}" ## remove old src rm -rf ".git/modules/${oldPath}" ## cleanup gitdir (housekeeping) ## commit git add .gitmodules git commit -m "Renamed ${oldPath} to ${newPath}"
大子模塊的獎勵方法:
若是子模塊很大而且您不想等待克隆,則可使用舊的原點建立新的子模塊,而後切換原點。
示例(使用相同的示例設置)
oldPath="jquery" newPath="vendor/jquery/jquery" baseDir=`pwd` orginUrl=`git config --local --get submodule.${oldPath}.url` # add new submodule using old submodule as origin mkdir -p `dirname "${newPath}"` git submodule add -- "file://${baseDir}/${oldPath}" "${newPath}" ## change origin back to original git config -f .gitmodules submodule."${newPath}".url "${orginUrl}" git submodule sync -- "${newPath}" ## remove old submodule ...
只需使用shell腳本git-submodule-move 。