Восстановление подмодулей git из.gitmodules
у меня есть папка, которая была git repo. Он содержит некоторые файлы .файл 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 делается
4 ответов:
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скрипт анализирует!-Файл -3-->.
расширяя ответ @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 будут очень приветствоваться :)
большое спасибо Марку,https://stackoverflow.com/a/226724/193494,bash: вложенное интерактивное чтение в цикле, который также использует читайте, и 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) пути могут быть причиной.
Я знаю, что это было некоторое время, но я хочу поделиться этой версией, которая вызывает
git configтолько один раз, не требует скрипта, а также обрабатывает ветви:git config -f .gitmodules --get-regexp '^submodule\.' | perl -lane' $conf{$F[0]} = $F[1]}{ @mods = map {s,\.path$,,; $_} grep {/\.path$/} keys(%conf); sub expand{$i = shift; map {$conf{$i . $_}} qw(.path .url .branch)} for $i (@mods){ ($path, $url, $branch) = expand($i); print(qq{rm -rf $path}); print(qq{git submodule add -b $branch $url $path}); } 'единственным побочным эффектом является вывод команд, ничего не выполняется, поэтому вы можете провести аудит перед их фиксацией.
это работает с простой копией и вставкой на консоли, но должно быть тривиальным, чтобы поместить в сценарий оболочки.
пример:
rm -rf third-party/dht git submodule add -b post-0.25-transmission https://github.com/transmission/dht third-party/dht rm -rf third-party/libutp git submodule add -b post-3.3-transmission https://github.com/transmission/libutp third-party/libutp rm -rf third-party/libb64 git submodule add -b post-1.2.1-transmission https://github.com/transmission/libb64 third-party/libb64 rm -rf third-party/libnatpmp git submodule add -b post-20151025-transmission https://github.com/transmission/libnatpmp third-party/libnatpmp rm -rf third-party/miniupnpc git submodule add -b post-2.0.20170509-transmission https://github.com/transmission/miniupnpc third-party/miniupnpc rm -rf third-party/libevent git submodule add -b post-2.0.22-transmission https://github.com/transmission/libevent third-party/libevent
Comments