如何在Git存儲庫中移動現有的Git子模塊?

我想在個人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"]

#1樓

給定的解決方案對我不起做用,但相似的版本確實...... vim

這是一個克隆的存儲庫,所以子模塊git repos包含在頂級存儲庫.git目錄中。 全部陽離子都來自頂級存儲庫: url

  1. 編輯.gitmodules並更改相關子模塊的「path =」設置。 (無需更改標籤,也無需將此文件添加到索引中。) spa

  2. 編輯.git / modules / name / config並更改相關子模塊的「worktree =」設置 code

  3. 跑: 索引

    mv submodule newpath/submodule git add -u git add newpath/submodule

我想知道若是存儲庫是原子的,或者相對的子模塊是否有所不一樣,在個人狀況下,它是相對的(子模塊/ .git是ref回到topproject / .git / modules / submodule)


#2樓

在個人例子中,我想將一個子模塊從一個目錄移動到一個子目錄,例如「AFNetworking」 - >「ext / AFNetworking」。 這些是我遵循的步驟:

  1. 編輯.gitmodules將子模塊名稱和路徑更改成「ext / AFNetworking」
  2. 將子模塊的git目錄從「.git / modules / AFNetworking」移動到「.git / modules / ext / AFNetworking」
  3. 將庫從「AFNetworking」移動到「ext / AFNetworking」
  4. 編輯「.git / modules / ext / AFNetworking / config」並修復[core] worktree行。 我從../../../AFNetworking改成../../../../ext/AFNetworking
  5. 編輯「ext / AFNetworking / .git」並修復gitdir 。 我從../.git/modules/AFNetworking改成../../git/modules/ext/AFNetworking
  6. git add .gitmodules
  7. git rm --cached AFNetworking
  8. 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

瞧瞧。 上面的例子不會改變目錄深度,這會對任務的複雜性產生很大的影響,而且不會改變子模塊的名稱(這可能不是必需的,但我這樣作是爲了與若是我在那條路徑上添加了一個新模塊,就會發生。)


#3樓

訣竅彷佛是要理解子模塊的.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文件。

#4樓

您只需添加一個新的子模塊,而後使用標準命令刪除舊的子模塊。 (應該防止.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
...

#5樓

只需使用shell腳本git-submodule-move

相關文章
相關標籤/搜索