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

给你一囗甜甜゛ 提交于 2020-03-11 19:39:04

我想在我的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而不先删除它( 在这里这里解释),然后重新添加它。

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

[submodule ".emacs.d/vimpulse"]

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

[submodule "vimpulse"]

#1楼

给定的解决方案对我不起作用,但类似的版本确实......

这是一个克隆的存储库,因此子模块git repos包含在顶级存储库.git目录中。 所有阳离子都来自顶级存储库:

  1. 编辑.gitmodules并更改相关子模块的“path =”设置。 (无需更改标签,也无需将此文件添加到索引中。)

  2. 编辑.git / modules / name / config并更改相关子模块的“worktree =”设置

  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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!