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