从.gitmodules恢复git子模块

我有一个文件夹,这是一个git回购。 它包含一些文件和.gitmodules文件。 现在,当我做git init然后git submodule init ,后面的命令输出是什么都没有。 如何帮助git查看.gitmodules文件中定义的子模块,而无需再次手动git submodule add

更新:这是我的.gitmodules文件:

[submodule "vim-pathogen"]
    path = vim-pathogen
    url = git://github.com/tpope/vim-pathogen.git
[submodule "bundle/python-mode"]
    path = bundle/python-mode
    url = git://github.com/klen/python-mode.git
[submodule "bundle/vim-fugitive"]
    path = bundle/vim-fugitive
    url = git://github.com/tpope/vim-fugitive.git
[submodule "bundle/ctrlp.vim"]
    path = bundle/ctrlp.vim
    url = git://github.com/kien/ctrlp.vim.git
[submodule "bundle/vim-tomorrow-theme"]
    path = bundle/vim-tomorrow-theme
    url = git://github.com/chriskempson/vim-tomorrow-theme.git

这里是这个目录的列表:

drwxr-xr-x  4 evgeniuz 100 4096 июня  29 12:06 .
drwx------ 60 evgeniuz 100 4096 июня  29 11:43 ..
drwxr-xr-x  2 evgeniuz 100 4096 июня  29 10:03 autoload
drwxr-xr-x  7 evgeniuz 100 4096 июня  29 12:13 .git
-rw-r--r--  1 evgeniuz 100  542 июня  29 11:45 .gitmodules
-rw-r--r--  1 evgeniuz 100  243 июня  29 11:18 .vimrc

所以,绝对是最高的。 git目录没有改变,只有git init完成


git submodule init只考虑已经在索引中的子模块(即“stage”)进行初始化。 我会编写一个简短的脚本来解析.gitmodules ,并为每个urlpath对运行:

git submodule add <url> <path>

例如,您可以使用以下脚本:

#!/bin/sh

set -e

git config -f .gitmodules --get-regexp '^submodule..*.path$' |
    while read path_key path
    do
        url_key=$(echo $path_key | sed 's/.path/.url/')
        url=$(git config -f .gitmodules --get "$url_key")
        git submodule add $url $path
    done

这是基于git-submodule.sh脚本如何解析.gitmodules文件。


扩展@Mark Longair的答案,我写了一个bash脚本来自动执行以下过程的第2步和第3步:

  • 克隆'样板'回购以开始一个新项目
  • 删除.git文件夹并重新初始化为新的回购
  • 重新初始化子模块,在删除文件夹之前提示输入

  • #!/bin/bash
    
    set -e
    rm -rf .git
    git init
    
    git config -f .gitmodules --get-regexp '^submodule..*.path$' > tempfile
    
    while read -u 3 path_key path
    do
        url_key=$(echo $path_key | sed 's/.path/.url/')
        url=$(git config -f .gitmodules --get "$url_key")
    
        read -p "Are you sure you want to delete $path and re-initialize as a new submodule? " yn
        case $yn in
            [Yy]* ) rm -rf $path; git submodule add $url $path; echo "$path has been initialized";;
            [Nn]* ) exit;;
            * ) echo "Please answer yes or no.";;
        esac
    
    done 3<tempfile
    
    rm tempfile
    

    注意:子模块将在其主分支的顶端检出,而不是与样板回购相同的提交,因此您需要手动执行此操作。

    将输出从git config配置到读取循环中会导致输入提示出现问题,因此它会将其输出到临时文件。 我对第一个bash脚本的任何改进都会非常欢迎:)


    非常感谢Mark,https://stackoverflow.com/a/226724/193494,bash:使用read的循环内的嵌套交互式读取,以及tnettenba @ chat.freenode.net帮助我获得此解决方案!


    我有类似的问题。 git submodule init失败了。

    当我这样做时:

    git submodule add <url> <path>

    我有:

    The following path is ignored by one of your .gitignore files: ...

    我在想,.gitignore(d)路径可能是原因。

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

    上一篇: Restore git submodules from .gitmodules

    下一篇: In Bash, how to add "Are you sure [Y/n]" to any command or alias?