73 votes

Git commit dans un sous-module commun (branche principale)

J'ai deux projets ou plus (appelons-les ProjectFoo et ProjectBar) avoir un code commun que j'ai mis dans un sous-module.

Ma compréhension est que si j'ai commis des modifications à un sous-module de l'intérieur ProjectFoo ça va être un décollement de la tête que seuls tous les ProjectFoo clones pouvez le voir:

(master) $ cd ProjectFooBarCommoneSubmodule/
(master) $ git commit -am "Common code fix."
(56f21fb0...) $ git push
Everything up-to-date

C'est probablement parce que l' master direction générale n'a pas changé. Je pourrais sans doute faire quelque chose comme git checkout master && git merge Everything up-to-date , mais qui semblent assez laid. Peut-être un git reset --hard master permettrait de faire la même chose mais il semble encore plus laide.

Comment avoir un code commun partagé par projet de, mis à jour à partir de l'intérieur de ces projets à l'aide? En d'autres termes, s'engageant à ce sous-module devez mettre à jour tous les différents dépôts (dépôts, et pas seulement des clones) qui utilisent ce même sous-module.

---- EDIT ----

Visiblement mon extrait du référentiel a été foiré et brisé. Il doit avoir travaillé dès le début comme ça (sur ProjectFoo dans cet exemple):

(master) $ cd ProjectFooBarCommoneSubmodule/
(master) $ git commit -am "Common code fix."
(master) $ git push
....
   fbfdd71..0acce63  master -> master
(master) $ cd ..
(master) $ git add ProjectFooBarCommoneSubmodule
(master) $ git commit -m "Submodule update."

Ensuite, pour obtenir le changement à partir sur d'autres projets, comme ProjectBar:

(master) $ cd ProjectFooBarCommoneSubmodule/
(master) $ git pull

Permettrait de mettre à jour vers la dernière de code commune. Un git checkout master peut être nécessaire, si c'est sur un décollement de la tête.

81voto

Kai Inkinen Points 1277

Réponse courte:

cd ProjectFooBarCommoneSubmodule
git checkout master
<Do your editing>
git commit --all -m "Lots of fixes"
git push submodule_origin master
cd ..

git add ProjectFooBarCommoneSubmodule
git commit -m "Bumped up the revision of ProjectFooBarCommoneSubmodule"
git push origin master

Le plus long:

Submodules sont un mécanisme de dépendance, où le projet principal (dire) définit une révision spécifiée dans un sous-projet (disons B), qui sera utilisé dans la construction du projet A. pour que l'outil soit utile le comportement est prévisible à partir d'Un:s point de vue. Les dépendances ne peut pas changer, à moins que quelqu'un décide d'intégrer le changement de projet A. Toutes sortes de mauvaises choses peuvent se produire, ont été le projet B:s automatique des modifications des produits importés, les erreurs de compilation sont probablement les meilleurs, comme pour remarquer la immédiatement les pannes. C'est pourquoi B:s la tête est maintenue en état détaché.

L'état de B est de stocker dans Un (découvrez git submodule status), et une révision de changement doit être fait et commis dans Un, dans l'ordre pour qu'il ait un quelconque effet. C'est ce qui se passe dans l'exemple ci-dessus, Un changement au numéro de révision stockée dans le dépôt, et se cogne la version la plus récente. Le processus devra être répété dans les autres grands repo, donc pas automatique "utiliser le maître" de l'interrupteur autant que je sache.

BTW. Le Git chapitre de livre sur submodules et le sous-module de la page de manuel contient de nombreuses informations utiles à propos de submodules, comme l'utilisation normale et typique de pièges. La peine de vérifier.


EDIT: je vais essayer de vous l'expliquer mieux

J'ai pris la liberté de créer des exemples de projets sur mon compte github. Les commits sont vides de sens et contiennent des cochonneries, mais le programme d'installation doit être fine. S'il vous plaît vérifier à suivre.

Les deux ProjectFoo et ProjectBar partager le code dans la commune de la sous-module.

ProjectFooBarCommoneSubmodule:maître est 6850e4e4c1fac49de398

Dans ProjectFoo:

git submodule status

-6850e4e4c1fac49de39890703f21486ca04b87a0 commune

Dans ProjectBar:

git submodule status

-6850e4e4c1fac49de39890703f21486ca04b87a0 commune

Donc, à la fois point de la même révision, droit? L'astuce ici est de voir, que ProjectFoo et ProjectBar point de la révision (6850e4e4c1fac49de39890703f21486ca04b87a0) pas la branche (master), bien qu'ils soient la même chose. Le premier est un décollement de la tête, et de l'autre une branche nommée.

Si vous voulez faire une fixation sur ProjectFooBarCommoneSubmodule, vous pouvez aller dans le sous répertoire dans, par exemple, ProjectFoo, et de choisir la branche de la révision:

git checkout master 
<Do your coding and pushing here>

Ensuite un répertoire et de contrôler git sous-module de statut. Il devrait vous dire, que vous êtes maintenant hors de la synchronisation. E. g

git submodule status

+e24bd2bf45d52171a63b67ac05cd4be0ac965f60 commun (heads/master-1-ge24bd2b)

Maintenant, vous pouvez faire un git add, pour définir la référence à ce commit(ge24bd...), validez, et après cela, le sous-module des points de référence à cette révision, qui se trouve également être le maître sur ProjectFooBarCommoneSubmodule.

Maintenant, vous devez mettre à jour la référence en ProjectBar ainsi. Aller à ProjectBar/commun, et ne git fetch origin (ce qui est une avance rapide de fusion), ne

git checkout master 
cd ..
git add common
git commit -m "Bumped up the revision"
git push origin master # to publish the revision bump to everybody else

Donc, comme avec n'importe quel dépôt git, vous n'avez pas besoin de travailler sur un décollement de la tête. Vous pouvez travailler sur le master, ou de créer une branche nommée. De toute façon, assurez-vous que l'amont contient les ProjectFooBarCommoneSubmodule changements, ou vous briser à la fois ProjectFoo et ProjectBar, si elles font référence à quelque chose qui n'existe pas. Espérons que cela explique mieux

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