J'ai un sous-module git dans mon dépôt git principal. Si je comprends bien, le référentiel principal stocke une valeur SHA (quelque part ...), pointant vers le commit spécifique du sous-module auquel il est "lié".
Je suis entré dans mon sous-module et j'ai tapé git checkout some_other_branch
. Je n'ai aucune idée de quel engagement je viens.
Je voudrais revenir sur ce pointeur afin que le dépôt principal et le sous-module soient à nouveau synchronisés.
Mon premier instinct (probablement naïf) était de dire git reset --hard
- cela semble fonctionner pour tout le reste. À ma grande surprise, cela n'a pas fonctionné pour ce scénario.
J'ai donc compris que je pouvais taper git diff
, noter l'identifiant SHA que le pointeur de sous-module avait, puis me diriger vers le sous-module et git checkout [SHA ID]
... mais il doit sûrement y avoir un moyen plus simple?
Comme j'apprends toujours les sous-modules git, n'hésitez pas à corriger ma terminologie s'il y a des mots pour des concepts que je ne connais pas.
la source
--init
. Sans cela, les sous-modules resteraient dans un état avec(new commits)
. Même si mes sous-modules étaient déjà initialisés.--init
option est cruciale dans tout cela. Je recevais une invite pour le nom d'utilisateur et le mot de passe car mes sous-modules ont été clonés sur https. Je suis allé dans les deux dossiers et j'ai configuré les télécommandes pour utiliser lessh
protocole de paiement.Pour modifier la validation vers laquelle pointe un sous-module, vous devez extraire cette version dans le sous-module, puis revenir au dépôt contenant, ajouter et valider cette modification.
Ou, si vous voulez que le sous-module soit sur la version vers laquelle pointe le dépôt supérieur, faites
git submodule update --recursive
. Ajoutez--init
si vous venez de cloner.De plus,
git submodule
sans commande de sous-module, vous verrez le commit vers lequel vous pointez. Il y aura un - ou un + devant le commit s'il n'est pas synchronisé.Si vous regardez un arbre contenant un sous-module, vous pouvez voir que le sous-module est marqué comme
commit
par opposition aux autres qui sont des blobs ou des arbres.pour voir ce qu'un commit particulier indique par rapport aux sous-modules, vous pouvez:
vous pouvez ensuite voir le commit ou autre chose si vous le souhaitez en le passant dans le journal, etc. (l'
git-dir
option au niveau de la commande git vous permet d'éviter d'avoir à cd jusqu'au sous-module):la source
Un autre cas que je viens de rencontrer est celui de la modification non mise en scène du sous-module que vous souhaitez supprimer. git submodule update ne supprimera pas cette modification, ni git reset --hard sur le répertoire parent. Vous devez aller dans le répertoire du sous-module et effectuer une réinitialisation git --hard. Donc, si je veux supprimer complètement les modifications non organisées dans mon parent et mon sous-module, je fais ce qui suit:
Dans Parent:
Dans le sous-module:
la source
Utilisez
git ls-tree HEAD
dans le dossier "superprojet" pour voir à quel commit se trouvait votre sous-module à l'origine. Ensuite, allez dans le répertoire du sous-module et utilisezgit log --oneline --decorate
pour voir sur quelle branche se trouve le commit d'origine. Enfin,git checkout original-commit-branch
.En utilisant certains répertoires de test que j'ai configurés, voici à quoi pourraient ressembler les commandes:
Le "superprojet" montre le sous-module sm2 au commit
f68bed6
mais sm2 a son HEAD sur5b8d48f
. Le commit de sous-modulef68bed6
a trois branches qui peuvent être utilisées pour l'extraction dans le répertoire du sous-module.la source
La réponse ici n'a pas résolu mon problème spécifique avec le sous-module, donc au cas où cela vous arriverait aussi, essayez ce qui suit ...
https://kalyanchakravarthy.net/blog/git-discard-submodule-changes/
la source
Je voulais ignorer tout changement dans le sous-module et dans mon module également
La commande ci-dessous m'a aidé:
la source