Comment puis-je spécifier une branche/étiquette lors de l'ajout d'un Git sous-module?
Comment git submodule add -b
travail?
Après l'ajout d'un sous-module avec une branche spécifique, une nouvelle cloné référentiel (après git submodule update --init
) sera un commit, pas la direction elle-même (git status
sur le sous-module affiche "Pas actuellement sur n'importe quelle branche").
Je ne peux pas trouver toutes les informations sur .gitmodules
ou .git/config
sur le sous-module de la direction générale ou spécifique de commettre, alors comment Git comprendre?
Aussi, est-il possible de spécifier une balise au lieu d'une branche?
J'utilise la version 1.6.5.2.
- Si vous avez un existant sous-module qui n'est pas suivi d'une branche encore, mais vous souhaitez qu'il serait suivi d'une branche... voir ma réponse ci-dessous
Vous devez vous connecter pour publier un commentaire.
Remarque: Git 1.8.2 ajout de la possibilité de suivre des branches. Voir les réponses ci-dessous.
C'est un peu déroutant pour s'habituer à cela, mais submodules ne sont pas sur une branche. Ils sont, comme vous le dites, juste un pointeur à un particulier d'engager des sous-module du référentiel.
Cela signifie que, lorsque quelqu'un d'autre qui vérifie votre référentiel, ou tire votre code, et ne git sous-module de mise à jour, le sous-module est vérifié à la commettre.
Ce qui est excellent pour un sous-module qui ne change pas souvent, parce qu'alors tout le monde sur le projet peut avoir le sous-module à la même livraison.
Si vous souhaitez vous déplacer à la sous-module d'un particulier tag:
Puis, un autre développeur qui veut avoir submodule_directory changé de marque, cela veut-il
git pull
changements qui commettent leurs sous-module répertoire de points.git submodule update
fait fusionne dans le nouveau code.cd my_submodule; git checkout [ref in submodule's repository
rendementsfatal: reference is not a tree: ...
. C'est comme sigit
ne fonctionne que sur le dépôt parent.git checkout v1.0
d'une succursale ou d'un tag?Je voudrais ajouter une réponse ici, c'est vraiment juste un conglomérat d'autres réponses, mais je pense qu'il peut être plus complète.
Vous savez que vous avez un Git sous-module lorsque vous avez ces deux choses.
Votre
.gitmodules
a une entrée comme suit:Vous avez un sous-module objet (nommé SubmoduleTestRepo dans cet exemple) dans votre dépôt Git. GitHub montre comme des "sous-module" objets. Ou ne
git submodule status
à partir d'une ligne de commande. Git sous-module d'objets sont des types spéciaux de Git objets, et ils tiennent le SHA de l'information pour un commit.Chaque fois que vous faites un
git submodule update
, il remplira votre sous-module avec le contenu de la livraison. Il sait où trouver le commis à cause de l'information dans le.gitmodules
.Maintenant, tous les
-b
n'est d'ajouter une ligne dans votre.gitmodules
fichier. Ainsi, en suivant le même exemple, il devrait ressembler à ceci:EDIT: uniquement nom de la branche est pris en charge ci-dessus, pas SHA ou l'ÉTIQUETTE.
Le sous-module objet est toujours en pointant sur un commit. La seule chose que l'
-b
option vous permet d'acheter est la possibilité d'ajouter un--remote
drapeau de votre mise à jour, comme par Vogella réponse:Au lieu de remplir le contenu de la sous-module à la livraison indiqué par le sous-module, il remplace qui s'engagent avec le dernier commit sur la branche master, PUIS il remplit le sous-module avec qui l'engagent. Cela peut être fait en deux étapes par djacobs7 réponse. Puisque vous avez maintenant mis à jour la validation de la sous-module objet de pointe, vous devez vous engager le changement de la sous-module objet dans votre dépôt Git.
git submodule add -b
n'est pas une magie de façon à maintenir le tout à jour, avec une branche. Il est tout simplement ajoute des informations sur une branche dans le.gitmodules
de fichiers et vous donne la possibilité de mettre à jour le sous-module objet de la dernière validation d'une branche avant de l'alimenter.git submodule add [-b]
est de savoir comment vous ajoutez un sous-module de votre dépôt git..gitmodules
et après avoir fait$ git submodule update --init --remote TestModule
j'ai une erreur disantfatal: Needed a single revision
etUnable to find current origin/TestTag revision in submodule path 'TestModule'
. Lorsque vous faites l'objet d'une véritable branche, il fonctionne. Est-il de toute façon à spécifier une balise dans.gitmodules
sans avoir à préciser les commettre?.git/modules/<submodule_name>/HEAD
IIRC..gitmodules
et a courugit submodule update
et rien ne s'est passé?git submodule add -b
... tout simplement ... vous donne la possibilité de mettre à jour le sous-module objet de la dernière validation d'une branche" Attendez une seconde. N'est-ce pas instruiregit
plutôt chercher le commit sur la branche à la place de celui par défaut que par superuser.com/questions/1240216/... ? git-scm.com/docs/gitmodules#gitmodules-submoduleltnamegtbranch suggère autant.Git(2.22, T2 2019, a introduit
git sous-module set-branche --direction de la abranche -- <submodule_path>
)Noter que si vous avez un existant sous-module qui n'est pas suivi une branche encore, puis (si vous avez git 1.8.2+):
Assurez-vous que le parent repo sait que son sous-module suit désormais une branche:
Assurez-vous que votre sous-module est en fait à la dernière de cette branche:
(avec "origine" étant le nom de la en amont à distance repo le sous-module a été cloné à partir d'.
Un
git remote -v
intérieur de ce sous-module affichera. Habituellement, il est "origine")N'oubliez pas d'enregistrer le nouvel état de votre sous-module dans votre parent repo:
Mise à jour ultérieure pour ce sous-module aurez à utiliser la
--remote
option:Noter qu'avec Git 2.10+ (T3 2016), vous pouvez utiliser '
.
" comme un nom de branche:Si vous souhaitez mettre à jour tous vos submodules à la suite d'une branche:
À noter que le résultat, pour chaque sous-module mis à jour, sera presque toujours un détaché de la TÊTE, comme Dan Cameron note dans sa réponse.
(Clintm notes dans les commentaires que, si vous exécutez
git submodule update --remote
et le sha1 est la même que la direction générale de la sous-module est actuellement sur, il ne rien faire et de laisser le sous-module encore "sur la branche" et pas dans décollement de la tête de l'état.)Pour assurer la branche est effectivement vérifié (et qui ne modifie pas le SHA1 de la entrée spéciale qui représente le sous-module pour le parent repo), il suggère:
Chaque sous-module sera toujours référence à la même SHA1, mais si vous faites des nouvelles validations, vous serez en mesure de pousser à eux, parce qu'ils seront référencés par la branche que vous souhaitez la sous-module de piste.
Après que pousser à l'intérieur d'un sous-module, n'oubliez pas d'aller à la maison mère pensions, d'ajouter, de s'engager et de pousser le nouveau SHA1 pour ceux qui sont modifiés submodules.
Notez l'utilisation de
$toplevel
, recommandé dans les commentaires par Alexander Pogrebniak.$toplevel
a été introduit dans git1.7.2 en Mai 2010: s'engager f030c96.dtmland
ajoute dans les commentaires:La même commande, mais plus facile à lire:
umläute affine dtmland's de commande avec une version simplifiée dans les commentaires:
plusieurs lignes:
submodule.<path>.branch
. Mais n'oubliez pas les autres étapes.foreach
script ne dépendra pas de la codé en dur<path>
, si vous remplacer<path>
avec$toplevel/
.$toplevel
.foreach
script échoue à la caisse submodules qui ne sont pas à la suite d'une branche. Toutefois, cette commande vous donne à la fois:git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout master || git checkout $branch'
git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
git pull
pour le script:git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master); git pull'
Au moins pour moi, c'est le travail de script.git submodule update --remote --merge
ougit submodule update --remote --rebase
. Ces commandes faire le suivi de la branche distante.submodule.<path>.<branch>
est trouvé.". Un décollement de la TÊTE ne fait pas référence à une branche. Il peut faire partie de différentes branches, inclus maître.git submodule update --remote
et de la sha est la même que la direction générale de la sous-module est actuellement en il ne rien faire et de laisser le sous-module encore "sur la branche" et pas dans décollement de la tête de l'état. (Version Git 2.17.0) @VonCGit 1.8.2 ajout de la possibilité de suivre des branches.
Voir aussi Submodules
.gitmodules
fichier?git submodule add -b tags/<sometag> <url>
de laquelle vous pouvez voir que la lignebranch = tags/<sometag>
dans.gitmodules
Un exemple de la façon dont j'utilise submodules.
Et qui ressemble un peu à ceci:
Peut-être que c'est une aide (même si j'utilise une balise et non une branche)?
git reset --hard V3.1.2
? Je viens d'obtenir un "rien à s'engager" avec ungit status
du répertoire parent.Dans mon expérience de commutation branches dans le superproject ou futures extractions sera toujours provoquer des détaché Chefs de submodules, peu importe si le sous-module est correctement ajoutée et de suivi (c'est à dire @djacobs7 et @Johnny Z réponses).
Et au lieu de saisir manuellement la vérification de la bonne branche manuellement ou via un script git sous-module foreach peut être utilisé.
Cela de vérifier le sous-module fichier de config pour la direction générale de la propriété et de validation de l'ensemble de la branche.
git submodule foreach -q --recursive 'branch="$(git config -f <path>.gitmodules submodule.$name.branch)"; git checkout $branch'
Submodules sont un peu étrange - ils sont toujours en "isolé" mode -, elles ne sont pas mis à jour avec le dernier commit sur une branche comme vous vous en doutez.
Cela fait sens quand vous pensez à ce sujet, cependant. Disons que je me suis créer un référentiel foo avec sous-module bar. Je pousse mes modifications et dites-vous de vérifier s'engager a7402be de référentiel foo.
Ensuite, imaginez que quelqu'un commet un changement de référentiel bar avant que vous pouvez faire de votre clone.
Lorsque vous découvrez commettre a7402be de référentiel foo, vous vous attendez à obtenir le même code, je l'ai poussé. C'est pourquoi submodules ne pas mettre à jour jusqu'à ce que vous leur dites explicitement et ensuite procéder à une nouvelle validation.
Personnellement, je pense submodules sont la partie la plus déroutante de Git. Il ya beaucoup d'endroits qui peuvent expliquer les submodules mieux que je peux. Je recommande Pro Git par Scott Chacon.
Pour changer de branche pour un sous-module (en supposant que vous avez déjà le sous-module dans le cadre du référentiel):
cd
à la racine de votre dépôt contenant les submodules.gitmodules
pour l'éditionpath = ...
eturl = ...
qui ditbranch = your-branch
, pour chaque sous-module; enregistrer le fichier.gitmodules
.$ git submodule update --remote
...cela devrait tirer dans le dernier s'engage sur la branche, pour chaque sous-module ainsi modifié.
J'ai ceci dans mon .gitconfig fichier. C'est encore un projet, mais il s'est avéré utile comme de maintenant. Il m'aide à toujours remettre en place le submodules à leur direction générale.
Nous utilisons Quack de tirer un module spécifique à partir d'un autre dépôt Git. Nous devons tirer les code sans le code complet de la base du référentiel - nous besoin d'un module spécifique /fichier à partir de cet immense dépôt et doit être mis à jour chaque fois que nous exécuter la mise à jour.
Nous avons donc réalisé dans cette voie:
Créer une configuration de
Avec la configuration ci-dessus, il crée un répertoire à partir du répertoire GitHub, comme spécifié dans la première configuration du module, et l'autre est de tirer et de créer un fichier à partir de la logithèque.
D'autres développeurs juste besoin d'exécuter
Et il tire le code de l'configurations ci-dessus.
Le seul effet de choisir une branche pour un sous-module, c'est que, chaque fois que vous passez la
--remote
option dans legit submodule update
ligne de commande, Git va vérifier dans le détaché de la TÊTE mode (si la valeur par défaut--checkout
comportement est sélectionné) le dernier commit sélectionné distance branche.Vous devez être particulièrement prudent lors de l'utilisation de cette branche à distance la fonction de suivi pour les submodules si vous travaillez avec une faible clones de submodules.
La direction de choisir à cet effet dans le sous-module des paramètres n'EST PAS celui qui sera cloné au cours de
git submodule update --remote
.Si vous passez également le
--depth
paramètre et vous ne chargent pas Git sur la branche que vous voulez cloner -- et en fait, vous ne peut pas dans legit submodule update
ligne de commande!! -- , il sera implicitement se comporter comme expliqué dans legit-clone(1)
documentation pourgit clone --single-branch
lorsque l'explicite--branch
paramètre est manquant, et donc il permet de cloner la branche primaire seulement.Sans surprise, après le clone étape réalisée par le
git submodule update
, il va finalement essayer de consulter les dernières de s'engager pour la distance de la branche que vous avez définies précédemment pour le sous-module, et, si ce n'est pas la principale, il ne fait pas partie de votre clone simple, et par conséquent, il échouera avecgit sous-module add-b à développer-le nom de la branche-nom - https://branch.git