(Git 2.22, Q2 2019, a introduit git submodule set-branch --branch aBranch -- <submodule_path>
)
Notez que si vous avez un existant sous-module qui n'est pas suivi d'une branche pour le moment alors ( si vous avez git 1.8.2+. ):
-
S'assurer que le repo parent sait que son sous-module suit maintenant une branche :
cd /path/to/your/parent/repo
git config -f .gitmodules submodule.<path>.branch <branch>
-
Assurez-vous que votre sous-module est bien au plus récent de cette branche :
cd path/to/your/submodule
git checkout -b branch --track origin/branch
# if the master branch already exist:
git branch -u origin/master master
(l'"origine" étant le nom de l'unité d'origine). repo distant en amont à partir duquel le sous-module a été cloné.
A git remote -v
à l'intérieur de ce sous-module l'affichera. En général, il s'agit de "origin")
-
N'oubliez pas d'enregistrer le nouvel état de votre sous-module dans votre dépôt parent :
cd /path/to/your/parent/repo
git add path/to/your/submodule
git commit -m "Make submodule tracking a branch"
-
Les mises à jour ultérieures pour ce sous-module devront utiliser le paramètre --remote
option :
# update your submodule
# --remote will also fetch and ensure that
# the latest commit from the branch is used
git submodule update --remote
# to avoid fetching use
git submodule update --remote --no-fetch
Notez qu'avec Git 2.10+. (Q3 2016), vous pouvez utiliser ' .
comme nom de branche :
Le nom de la branche est enregistré comme submodule.<name>.branch
sur .gitmodules
para update --remote
.
Une valeur spéciale de .
est utilisé pour indiquer que le nom de la branche dans le sous-module doit être le même que celui de la branche courante dans le référentiel courant. .
Mais, comme commenté par LubosD
Avec git checkout
si le nom de la branche à suivre est " .
", cela tuera votre travail non engagé !
Utilisez git switch
à la place.
Cela signifie Git 2.23 (août 2019) ou plus.
Voir " Confus par git checkout
"
Si vous voulez mettre à jour tous vos sous-modules en suivant une branche :
git submodule update --recursive --remote
Notez que le résultat, pour chaque sous-module mis à jour, sera presque toujours être un HEAD détaché comme Dan Cameron note en sa réponse .
( Clintm notes dans les commentaires que, si vous exécutez git submodule update --remote
et le sha1 résultant est le même que la branche sur laquelle le submodule est actuellement, il ne fera rien et laissera le submodule toujours "sur cette branche" et non dans l'état de tête détachée).
Pour s'assurer que la branche est effectivement extraite (et que cela ne modifiera pas le SHA1 de l'archive entrée spéciale représentant le sous-module pour le repo parent), il suggère :
git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; git switch $branch'
Chaque sous-module référencera toujours le même SHA1, mais si vous faites de nouveaux commits, vous pourrez les pousser car ils seront référencés par la branche que vous voulez que le sous-module suive.
Après ce push dans un submodule, n'oubliez pas de retourner dans le repo parent, d'ajouter, de commiter et de pousser le nouveau SHA1 pour ces submodules modifiés.
Notez l'utilisation de $toplevel
recommandé dans les commentaires par Alexander Pogrebnyak .
$toplevel
a été introduit dans git1.7.2 en mai 2010 : commettre f030c96 .
il contient le chemin absolu du répertoire de niveau supérieur (où .gitmodules
est).
dtmland
ajoute dans les commentaires :
Le foreach script échouera à extraire les submodules qui ne suivent pas une branche.
Cependant, cette commande vous donne les deux :
git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout master || git switch $branch' –
La même commande mais plus facile à lire :
git submodule foreach -q --recursive \
'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; \
[ "$branch" = "" ] && \
git checkout master || git switch $branch' –
umläute affine dtmland avec une version simplifiée dans les commentaires :
git submodule foreach -q --recursive 'git switch $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
plusieurs lignes :
git submodule foreach -q --recursive \
'git switch \
$(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
Avant Git 2.26 (Q1 2020), un fetch qui est chargé de récupérer récursivement les mises à jour dans les submodules produit inévitablement des tonnes de données et il devient difficile de repérer les messages d'erreur.
La commande a été apprise pour énumérer les sous-modules qui avaient des erreurs à la fin de l'opération .
Voir engagement 0222540 (16 janvier 2020) par Emily Shaffer ( nasamuffin
) .
(fusionné par Junio C Hamano -- gitster
-- sur commettre b5c71cc , 05 Feb 2020)
fetch
: accentuer l'échec lors de la récupération du sous-module
Signé par : Emily Shaffer
Lorsqu'une recherche de sous-modules échoue alors qu'il y a de nombreux sous-modules, l'erreur liée à la seule recherche de sous-modules qui échoue est noyée sous l'activité des autres sous-modules si plusieurs recherches se sont soldées par un échec. fetch-by-oid
.
Signaler un échec tardif afin que l'utilisateur sache que quelque chose s'est mal passé et à quel endroit. .
Parce que fetch_finish()
n'est appelé de manière synchrone que par run_processes_parallel,
le mutexing n'est pas nécessaire autour de submodules_with_errors
.
Notez que, avec Git 2.28 (Q3 2020), la réécriture de certaines parties de la commande scriptée "git submodule" Porcelain se poursuit ; cette fois, il s'agit de " git submodule set-branch
C'est le tour de la sous-commande ".
Voir commettre 2964d6e (02 Jun 2020) par Shourya Shukla ( periperidip
) .
(fusionné par Junio C Hamano -- gitster
-- sur commettre 1046282 25 juin 2020)
submodule
: sous-commande de portage 'set-branch' du shell vers C
Parrainé par : Christian Couder
Mentoré par : Kaartic Sivaraam
Assisté par : Denton Liu
Assisté par : Eric Sunshine
Aide : Đoàn Trần Công Danh
Signé par : Shourya Shukla
Convertir la sous-commande du sous-module 'set-branch' en un buildin et l'appeler via git submodule.sh
.
6 votes
Si vous avez un existant sous-module qui ne suit pas encore une branche mais vous souhaitez qu'il suive une branche... voir ma réponse ci-dessous