如何在Git存储库中移动现有的Git子模块?

我想在我的Git超级项目中更改Git子模块的目录名称。

让我们假设我在.gitmodules文件中有以下条目:

[submodule ".emacs.d/vimpulse"]  
path = .emacs.d/vimpulse  
url = git://gitorious.org/vimpulse/vimpulse.git

我需要输入什么信息才能将.emacs.d/vimpulse目录移至.emacs.d/vendor/vimpulse而不.emacs.d/vendor/vimpulse删除它(此处和此处解释),然后重新添加它。

Git是否真的需要子模块标签中的整个路径

[submodule ".emacs.d/vimpulse"]

或者是否也可以只存储子项目的名称?

[submodule "vimpulse"]

注意:正如评论中提到的,这个答案指的是旧版本git所需的步骤。 Git现在支持移动子模块:

由于git 1.8.5, git mv old/submod new/submod按预期工作,并为您完成所有管道工作。 您可能想要使用git 1.9.3或更高版本,因为它包含子模块移动的修复程序。


这与您如何移除子模块相似(请参阅如何移除子模块?):

  • 编辑.gitmodules并适当地更改子模块的路径,并使用git add .gitmodules将其放入索引中。
  • 如果需要,创建子模块新位置的父目录( mkdir -p new/parent )。
  • 将所有内容从旧目录移到新目录( mv -vi old/parent/submodule new/parent/submodule )。
  • 确保Git跟踪这个目录( git add new/parent )。
  • 使用git rm --cached old/parent/submodule删除旧目录。
  • 将目录.git/modules/old/parent/submodule及其所有内容移至.git/modules/new/parent/submodule
  • 编辑.git/modules/new/parent/config文件,确保worktree项指向新的位置,所以在这个例子中它应该是worktree = ../../../../../new/parent/module 。 通常应该有两个以上..然后在那个地方的直接路径的目录。
  • 编辑文件new/parent/module/.git ,确保其中的路径指向主项目.git文件夹内的正确新位置,因此在本例中gitdir: ../../../.git/modules/new/parent/submodule .git gitdir: ../../../.git/modules/new/parent/submodule

    git status输出对我来说是这样的:

    # On branch master
    # Changes to be committed:
    #   (use "git reset HEAD <file>..." to unstage)
    #
    #       modified:   .gitmodules
    #       renamed:    old/parent/submodule -> new/parent/submodule
    #
    
  • 最后,提交更改。


  • 最现代的答案取自Valloric上面的评论:

  • 升级到Git 2.0(或至少1.9.3)
  • git mv old/submod new/submod
  • 之后,.gitmodules和子模块目录已经进行了提交(您可以使用git status来验证此目录)。
  • 使用git commit提交更改,并且您很好!
  • 完成!


    就我而言,我想将子模块从一个目录移动到子目录,例如“AFNetworking” - >“ext / AFNetworking”。 这些是我遵循的步骤:

  • 编辑.gitmodules将子模块名称和路径更改为“ext / AFNetworking”
  • 将子模块的git目录从“.git / modules / AFNetworking”移动到“.git / modules / ext / AFNetworking”
  • 将库从“AFNetworking”移动到“ext / AFNetworking”
  • 编辑“.git / modules / ext / AFNetworking / config”并修复[core] worktree行。 从../../../AFNetworking更改为../../../../ext/AFNetworking
  • 编辑“ext / AFNetworking / .git”并修复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
    

    Et瞧。 上面的例子没有改变目录深度,这对任务的复杂性产生很大的影响,并且不会改变子模块的名称(这可能并不是必须的,但我确实与它一致如果我在该路径上添加了新模块,将会发生。)

    链接地址: http://www.djcxy.com/p/16449.html

    上一篇: How do I move an existing Git submodule within a Git repository?

    下一篇: No submodule mapping found in .gitmodule for a path that's not a submodule