web-dev-qa-db-fra.com

Restaurer les sous-modules git à partir de .gitmodules

J'ai un dossier, qui était un dépôt git. Il contient des fichiers et un fichier .gitmodules. Maintenant, quand je fais git init et alors git submodule init, la dernière sortie de commande n'est rien. Comment puis-je aider git à voir les sous-modules, définis dans le fichier .gitmodules sans exécuter git submodule add à la main à nouveau?

Mise à jour: voici mon fichier .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

et voici la liste de ce 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

donc, définitivement, c'est au plus haut niveau. le répertoire git n'est pas modifié, seulement git init est fait

66
evgeniuz

git submodule init ne prend en compte que les sous-modules qui figurent déjà dans l'index (c'est-à-dire "par étapes") pour l'initialisation. J'écrirais un court script qui analyse .gitmodules, et pour chaque paire url et path:

git submodule add <url> <path>

Par exemple, vous pouvez utiliser le script suivant:

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

Ceci est basé sur la façon dont git-submodule.sh script analyse lui-même le .gitmodules fichier.

90
Mark Longair

En développant la réponse de @Mark Longair, j'ai écrit un script bash pour automatiser les étapes 2 et 3 du processus suivant:

  1. Cloner un référentiel 'passe-partout' pour commencer un nouveau projet
  2. Supprimez le dossier .git et réinitialisez-le en tant que nouveau référentiel
  3. Réinitialiser les sous-modules, en demandant une entrée avant de supprimer des dossiers

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

Remarque: les sous-modules seront extraits à la pointe de leur branche principale au lieu du même commit que le repo passe-partout, vous devrez donc le faire manuellement.

Le fait de canaliser la sortie de git config dans la boucle de lecture causait des problèmes avec l'invite d'entrée, donc elle la sort dans un fichier temporaire à la place. Toute amélioration de mon premier script bash serait la bienvenue :)


Un grand merci à Mark, https://stackoverflow.com/a/226724/193494 , bash: lecture interactive imbriquée dans une boucle qui utilise également read , et tnettenba @ chat .freenode.net pour m'aider à arriver à cette solution!

15
Kevin C.

Extension de l'excellente réponse de @Mark Longair pour ajouter un sous-module respectant le nom de la branche et du référentiel.

#!/bin/sh

set -e

git config -f .gitmodules --get-regexp '^submodule\..*\.path$' |
    while read path_key path
    do
        name=$(echo $path_key | sed 's/\submodule\.\(.*\)\.path/\1/')
        url_key=$(echo $path_key | sed 's/\.path/.url/')
        branch_key=$(echo $path_key | sed 's/\.path/.branch/')
        url=$(git config -f .gitmodules --get "$url_key")
        branch=$(git config -f .gitmodules --get "$branch_key" || echo "master")
        git submodule add -b $branch --name $name $url $path || continue
    done
4
mauron85

J'ai eu un problème similaire. git submodule init échouait silencieusement.

Quand je l'ai fait:

git submodule add <url> <path>

J'ai eu:

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

Je pense que les chemins .gitignore (d) pourraient être la cause.

3
Henry

Je sais que ça fait un moment, mais je veux partager cette version qui appelle git config une seule fois, ne nécessite pas de script et gère également les branches:

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});
}
'

Le seul effet secondaire est la sortie des commandes, rien n'est exécuté, vous pouvez donc auditer avant de vous y engager.

Cela fonctionne avec un simple copier-coller sur la console, mais devrait être trivial à mettre dans un script Shell.

exemple de sortie:

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
1
alexgirao