2012-06-29 4 views
56

У меня есть папка, которая была git repo. Он содержит некоторые файлы и файл .gitmodules. Теперь, когда я делаю git init, а затем git submodule init, последний вывод команды ничего. Как я могу помочь git, чтобы увидеть подмодули, определенные в файле .gitmodules, без повторного запуска git submodule add вручную?Восстановить git-подмодули из .gitmodules

Update: это мой .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 сделано

+0

ли Подмодули уже присутствует, в том смысле, что если изменить в любой каталог подмодуля есть файлы присутствуют, и 'мерзавец преподобным синтаксический анализ --show-toplevel' дает вам подмодуль, а не каталог «супермодулей»? –

+0

нет, подмодульные каналы нет. представьте, что эта папка полностью пуста, просто с файлом '.gitmodules' – Shark

+0

А, я понимаю, в чем проблема - я обновил свой ответ. –

ответ

78

git submodule init рассматривает только подмодули, которые уже находятся в индексе (то есть «поставлены») для инициализации. Я хотел бы написать короткий скрипт, который разбирает .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 script сам анализирует файл .gitmodules.

+0

Вы имеете в виду 'git submodule update --init'? все эти команды терпят неудачу. Похоже, что git не видит модули, определенные только в '.gitmodules' – Shark

+0

После' git subodule init' вы видите любой вывод из 'git config -list | grep subodule'? (Как говорится в документации, 'git submodule init' должен« инициализировать подмодули, т. Е. Регистрировать каждое имя подмодуля и url, найденное в .gitmodules, в '.git/config'».) –

+0

нет, ничего. 'git config --list' дает только стандартные значения, не упоминает о подмодулях – Shark

15

Развивая ответ @Mark Longair, я написал Баш скрипт для автоматизации шаги 2 & 3 следующего процесса:

  1. клонировать «шаблонный» репо, чтобы начать новый проект
  2. Снимите. папка мерзавец и повторно инициализировать как новый репозиторий
  3. Переинициализируйте подмодули, побуждая для ввода перед удалением папок

#!/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 в цикл чтения вызывало проблемы с запросом ввода, поэтому вместо этого он выводит его в файл temp. Любые улучшения на мой первый Баш скрипт будет очень кстати :)


Большое спасибо Марку, https://stackoverflow.com/a/226724/193494, bash: nested interactive read within a loop that's also using read, и tnettenba @ chat.freenode.net помог мне прийти к этому решению!

2

У меня была аналогичная проблема. git submodule init терпел неудачу.

Когда я сделал:

git submodule add <url> <path>

я получил:

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

Я имею в виду, что .gitignore (д) пути может быть причиной.

Смежные вопросы