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

标签 git git-submodules

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

假设我的 .gitmodules 文件中有以下条目:

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

我必须输入什么才能将 .emacs.d/vimpulse 目录移动到 .emacs.d/vendor/vimpulse 而不先删除它(已解释 herehere ) 然后重新添加它。

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

[submodule ".emacs.d/vimpulse"]

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

[submodule "vimpulse"]

最佳答案

较新版本的 git

Git 现在原生支持移动子模块:

Since git 1.8.5, git mv old/submod new/submod works as expected and does all the plumbing for you. You might want to use git 1.9.3 or newer, because it includes fixes for submodule moving.

旧版本的 git

如评论中所述,此答案指的是旧版本 git 所需的步骤。

该过程类似于您删除子模块的方式(参见 How do I remove a submodule? ):

  1. 编辑.gitmodules 并适当更改子模块的路径,并使用git add .gitmodules 将其放入索引中。

  2. 如果需要,创建子模块新位置的父目录 (mkdir -p new/parent)。

  3. 将所有内容从旧目录移动到新目录 (mv -vi old/parent/submodule new/parent/submodule)。

  4. 确保 Git 跟踪此目录 (git add new/parent)。

  5. 使用 git rm --cached old/parent/submodule 删除旧目录。

  6. 将目录 .git/modules/old/parent/submodule 及其所有内容移动到 .git/modules/new/parent/submodule

  7. 编辑.git/modules/new/parent/config文件,确保worktree项指向新的位置,所以在这个例子中它应该是worktree = ../../../../../new/parent/module.通常应该有两个 .. 比那个地方的直接路径中的目录。

  8. 编辑文件new/parent/module/.git,确保其中的路径指向主项目.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
     #
    
  9. 最后,提交更改。

关于git - 如何在 Git 存储库中移动现有的 Git 子模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4604486/

相关文章:

git - 是否可以在 Git 中移动/重命名文件并维护它们的历史记录?

用于执行 Jenkins shell 脚本的 Git 环境变量

git 按子文件夹拆分存储库并保留所有旧分支

git - 如何在预提交时运行 gulp minify?

node.js - 如何将nodejs代码从本地计算机部署到google app引擎

git 管道命令获取远程子模块

git-submodules - git子模块与npm包?

Git 子模块 - 权限被拒绝

git - Xcode 不断提交 DerivedData 文件夹

git submodule sync 命令 - 它有什么用?