从.gitmodules还原git子模块

我有一个文件夹,这是一个git回购。 它包含一些文件和.gitmodules文件。 现在,当我做git init ,然后git submodule init ,后者的命令输出是什么。 我怎样才能帮助看到.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只考虑已经在索引(即“staged”)中的子模块进行初始化。 我会编写一个简短的脚本来parsing.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脚本如何parsing.gitmodules文件。

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

  1. 克隆一个“样板”回购,开始一个新项目
  2. 删除.git文件夹并重新初始化为一个新的回购
  3. 重新初始化子模块,在删除文件夹之前提示input

 #!/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 configconfiguration到读取循环中会导致input提示出现问题,因此将其输出到临时文件。 我的第一个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)path可能是原因。