从.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
,并为每个url
和path
对运行:
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步:
- 克隆一个“样板”回购,开始一个新项目
- 删除.git文件夹并重新初始化为一个新的回购
- 重新初始化子模块,在删除文件夹之前提示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可能是原因。