web-dev-qa-db-fra.com

Git sous-module push

Si je modifie un sous-module, puis-je remettre le commit à l'origine du sous-module ou cela nécessiterait-il un clone? Si clone, puis-je stocker un clone dans un autre référentiel?

109
webjay

Un sous-module n'est rien d'autre qu'un clone d'un référentiel git dans un autre référentiel avec des métadonnées supplémentaires (entrée de l'arborescence gitlink, fichier .gitmodules)

$ cd your_submodule
$ git checkout master
<hack,edit>
$ git commit -a -m "commit in submodule"
$ git Push
$ cd ..
$ git add your_submodule
$ git commit -m "Updated submodule"
117
manojlds

Notez que depuis git1.7.11 ( [ANNOUNCE] Git 1.7.11.rc1 et note de version , juin 2012) mentionne:

"git Push --recurse-submodules" A appris à consulter éventuellement l'historique des sous-modules liés au superprojet et à les repousser.

Probablement fait après ce correctif et l'option --on-demand:

recurse-submodules=<check|on-demand>::

Assurez-vous que tous les commits de sous-module utilisés par les révisions à pousser sont disponibles sur une branche de suivi distante.

  • Si check est utilisé, il sera vérifié que toutes les validations de sous-modules modifiées dans les révisions à envoyer sont disponibles sur une télécommande.
    Sinon, le Push sera abandonné et sortira avec un statut différent de zéro.
  • Si on-demand Est utilisé, tous les sous-modules qui ont été modifiés dans les révisions à pousser seront poussés.
    Si à la demande n'était pas capable de pousser toutes les révisions nécessaires, il sera également abandonné et sortira avec un statut différent de zéro.

Donc, vous pouvez tout pousser en une fois avec (du repo parent) a:

git Push --recurse-submodules=on-demand

Cette option ne fonctionne que pour un niveau d'imbrication. Les modifications apportées au sous-module à l'intérieur d'un autre sous-module ne seront pas appliquées.


Avec git 2.7 (janvier 2016), un simple push git suffira à pousser le repo parent ... et tous ses sous-modules.

Voir commit d34141c , commit f5c7cd9 (03 déc 2015), commit f5c7cd9 (03 déc 2015), et commit b33a15b = (17 nov. 2015) par Mike Crowe (mikecrowe) .
(Fusionnée par Junio ​​C Hamano - gitster - dans commit 5d35d72 , 21 décembre 2015)

Push: add recurseSubmodules option de configuration

Le paramètre de ligne de commande --recurse-submodules Existe depuis un certain temps mais il n'a pas d'équivalent dans le fichier de configuration.

Suivant le style du paramètre correspondant pour git fetch, Inventons Push.recurseSubmodules Pour fournir une valeur par défaut pour ce paramètre.
Ceci nécessite également l'ajout de --recurse-submodules=no Pour permettre à la configuration d'être remplacée sur la ligne de commande lorsque cela est nécessaire.

Le moyen le plus simple d'implémenter cela semble être de faire en sorte que Push utilise le code dans submodule-config De la même manière que fetch.

Le git config Doc inclut maintenant :

Push.recurseSubmodules:

Assurez-vous que tous les commits de sous-module utilisés par les révisions à pousser sont disponibles sur une branche de suivi à distance.

  • Si la valeur est 'check', alors Git vérifiera que toutes les validations de sous-module modifiées dans les révisions à envoyer sont disponibles sur au moins une de ses télécommandes. Si des commits sont manquants, le Push sera abandonné et sortira avec un statut différent de zéro.
  • Si la valeur est 'on-demand', Alors tous les sous-modules qui ont été modifiés dans les révisions à pousser seront envoyés. Si à la demande n'a pas été en mesure d'envoyer toutes les révisions nécessaires, il sera également abandonné et sortira avec un statut différent de zéro. -
  • Si la valeur est 'no', le comportement par défaut consistant à ignorer les sous-modules lors du transfert est conservé.

Vous pouvez remplacer cette configuration au moment du Push en spécifiant '--recurse-submodules=check|on-demand|no'.

Alors:

git config Push.recurseSubmodules on-demand
git Push

Git 2.12 (T1 2017)

git Push --dry-run --recurse-submodules=on-demand Fonctionnera réellement.

Voir commit 0301c82 , commit 1aa7365 (17 nov. 2016) par Brandon Williams (mbrandonw) .
(Fusionnée par Junio ​​C Hamano - gitster - dans commit 12cf11 , 16 décembre 2016)

Push run with --dry-run N'effectue pas de test à vide (Git 2.11 déc. 2016 et avant/avant) lorsque Push est configuré pour pousser des sous-modules Push à la demande.
Au lieu de cela, tous les sous-modules qui doivent être poussés sont réellement poussés vers leurs télécommandes tandis que toutes les mises à jour pour le superprojet sont effectuées à sec.
Il s’agit d’un bogue et non du comportement voulu d’un essai.

Apprenez à Push à respecter l'option --dry-run Lors de la configuration pour pousser récursivement les sous-modules 'à la demande'.
Ceci est effectué en transmettant l'indicateur --dry-run Au processus enfant qui exécute un Push pour un sous-module lors d'une exécution à sec.


Et toujours dans Git 2.12, vous avez maintenant une option "--recurse-submodules=only" pour sortir les sous-modules sans pousser le superprojet de niveau supérieur .

Voir commit 225e8bf , commit 6c656c , commit 14c01bd (19 décembre 2016) par Brandon Williams (mbrandonw) .
(Fusionnée par Junio ​​C Hamano - gitster - dans commit 792e22e , 31 janv. 2017)

98
VonC