93 votes

Restaurer les submodules git à partir de .gitmodules

J'ai un dossier, qui était un dépôt git. Il contient quelques fichiers et le fichier .gitmodules. Maintenant, quand je fais git init et ensuite git submodule init le résultat de cette dernière commande n'est rien. Comment puis-je aider git à voir les submodules, définis dans le fichier .gitmodules, sans exécuter la commande 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 directeur :

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, il est au niveau supérieur. le répertoire git n'est pas modifié, seulement git init est fait

0 votes

Les submodules sont-ils déjà présents, en ce sens que si vous passez dans un répertoire de submodule, des fichiers sont présents, et git rev-parse --show-toplevel vous donne le répertoire du sous-module plutôt que celui du "supermodule" ?

0 votes

Non, les répertoires de sous-modules ne sont pas présents. imaginez que ce dossier soit complètement vide avec seulement .gitmodules fichier

0 votes

Ah, je vois quel est le problème - j'ai mis à jour ma réponse.

1voto

alexgirao Points 354

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é, ce qui vous permet d'effectuer un audit avant de vous engager.

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

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

0voto

nhooyr Points 885

Pour les utilisateurs de zsh, essayez ma fonction qui a DRY_RUN=1 pour savoir quelles commandes seront exécutées et utilise uniquement git pour analyser le fichier au lieu de sed .

gsub_file() {(
  set -eu

  cd "$(git rev-parse --show-toplevel)"

  submodule_paths=(
    "${(@f)$(git config --file ./.gitmodules --get-regexp "path" | awk '{ print $2 }')}"
  )
  submodule_urls=(
    "${(@f)$(git config --file ./.gitmodules --get-regexp "url" | awk '{ print $2 }')}"
  )
  submodule_branches=(
    "${(@f)$(git config --file ./.gitmodules --get-regexp "branch" | awk '{ print $2 }')}"
  )

  sh_c() {
    echo + "$*"
    if [ "${DRY_RUN-}" ]; then
      return
    fi
    eval "$@"
  }

  for (( i=1; i <= ${#submodule_paths[@]}; i++ )) do
    p="${submodule_paths[$i]}"
    if [ -d "$p" ]; then
      continue
    fi

    url="${submodule_urls[$i]}"
    unset b
    if [ "${submodule_branches[$i]-}" ]; then
      b="-b ${submodule_branches[$i]}" 
    fi
    sh_c git submodule add "${b-}" "$url" "$p"
  done
)}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X