2012-06-29 22 views
56

Tengo una carpeta, que era un git repo. Contiene algunos archivos y un archivo .gitmodules. Ahora, cuando hago git init y luego git submodule init, el último resultado del comando no es nada. ¿Cómo puedo ayudar a Git a ver los submódulos, definidos en el archivo .gitmodules sin ejecutar git submodule add a mano otra vez?Restaurar submódulos de git de .gitmodules

Actualización: este es mi archivo .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 

y aquí está la lista de esta dir:

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 

así, sin duda, es en el nivel superior. el directorio git no se cambia, solo git init se hace

+0

¿Los submódulos ya están presentes, en el sentido de que si cambia a cualquier directorio de submódulos hay archivos presentes, y 'git rev-parse --show-toplevel' le da el submódulo en lugar del directorio" supermódulo "? –

+0

no, los directorios de submódulo no están presentes. imagine que esta carpeta está completamente vacía con el archivo '.gitmodules' – Shark

+0

Ah, ya veo cuál es el problema: he actualizado mi respuesta. –

Respuesta

78

git submodule init solo considera los submódulos que ya están en el índice (es decir, "en etapas") para la inicialización. Me gustaría escribir un pequeño script que analiza .gitmodules, y para cada url y path par se ejecuta:

git submodule add <url> <path> 

Por ejemplo, se puede utilizar el siguiente script:

#!/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 

Esto se basa en cómo el git-submodule.sh script él mismo analiza el archivo .gitmodules.

+0

¿te refieres a 'git submodule update --init'? todos estos comandos fallan silenciosamente. Parece que git no ve los módulos definidos solo en '.gitmodules' – Shark

+0

Después del' git submodule init', ¿ves algún resultado de 'git config --list | ¿Submódulo grep'? (Como dice la documentación, 'git submódulo init' debería" Inicializar los submódulos, es decir, registrar cada nombre de submódulo y la URL que se encuentra en .gitmodules en '.git/config'".) –

+0

no, nada. 'git config --list' da solo valores estándar, sin mencionar los submódulos – Shark

15

Ampliando la respuesta de @ Marcos Longair, me escribió un script bash para automatizar los pasos 2 & 3 del siguiente proceso:

  1. Clon un acuerdo de recompra 'repetitivo' para comenzar un nuevo proyecto
  2. Retire el. carpeta de Git y reinicializar como nueva operación
  3. re-inicializar los submódulos, lo que provocó una entrada antes de eliminar carpetas

#!/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 

Nota: los submódulos se verificarán en la punta de su rama maestra en lugar de la misma confirmación que el repositorio repetitivo, por lo que deberá hacerlo manualmente.

Tubería de la salida de git config en el bucle de lectura estaba causando problemas con la solicitud de entrada, por lo que en su lugar se emite a un archivo temporal. Cualquier mejora en mi guión primera fiesta sería muy bienvenido :)


Muchas gracias a Marcos, https://stackoverflow.com/a/226724/193494, bash: nested interactive read within a loop that's also using read y tnettenba @ chat.freenode.net por ayudarme a llegar a esta solución!

2

Tuve un problema similar. git submodule init estaba fallando silenciosamente.

Cuando lo hice:

git submodule add <url> <path>

que tengo:

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

estoy pensando que .gitignore (d) caminos podrían ser la causa.

Cuestiones relacionadas