Comment rétablir un pointeur de sous-module Git vers le commit stocké dans le référentiel conteneur?

128

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.

Smashery
la source

Réponses:

167

Vous souhaitez mettre à jour votre sous-module afin qu'il soit synchronisé avec ce que le référentiel parent pense qu'il devrait être. Voici à quoi sert la commande update:

Depuis la page de manuel du sous-module:

Mettre à jour les sous-modules enregistrés, c'est-à-dire cloner les sous-modules manquants et
checkout le commit spécifié dans l'index du contenant
dépôt. Cela rendra les sous-modules HEAD détachés à moins que
--rebase ou --merge est spécifié ou le sous-module clé. $ name.update
est configuré pour rebaser ou fusionner.

Exécutez ceci et tout devrait bien se passer:

git submodule update
Brian Riehman
la source
4
D'une manière ou d'une autre, pour moi j'avais besoin d'ajouter --init. Sans cela, les sous-modules resteraient dans un état avec (new commits). Même si mes sous-modules étaient déjà initialisés.
Ambidex
@Ambidex oui l' --initoption 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 le sshprotocole de paiement.
A-Dubb
1
ne fonctionne pas si le hachage de validation de sous-module est modifié et désinstallé
tribbloid
peut ajouter --recursive afin que vous n'ayez pas besoin d'aller à tous les sous
Gaspa79
21

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 --initsi vous venez de cloner.

De plus, git submodulesans 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 commitpar 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:

git ls-tree <some sha1, or branch, etc> Submodule/path

vous pouvez ensuite voir le commit ou autre chose si vous le souhaitez en le passant dans le journal, etc. (l' git-diroption au niveau de la commande git vous permet d'éviter d'avoir à cd jusqu'au sous-module):

git --git-dir=Submodule/path log -1 $(<the above statement>)
Adam Dymitruk
la source
La commande ci-dessous m'a aidé (je voulais ignorer tout changement dans le sous-module et dans mon module également): git submodule update --init --recursive
Rajesh Goel
6

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:

git reset --hard

git submodule update

Dans le sous-module:

git reset --hard
Benjamin Noffsinger
la source
5

Utilisez git ls-tree HEADdans le dossier "superprojet" pour voir à quel commit se trouvait votre sous-module à l'origine. Ensuite, allez dans le répertoire du sous-module et utilisez git log --oneline --decoratepour 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:

$ git --version
git version 1.7.4.1
$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   sm2 (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git ls-tree HEAD
100644 blob 76813a07ae558db274cefc6d903ec24323fdeb0d    .gitmodules
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    main
160000 commit 7c5889497938cd5699a9234a98ee93947e52b1ed  sm1
160000 commit f68bed61cba6f94cef57554f2cf46a45a4a0d337  sm2
$ cd sm2
$ git log --oneline --decorate
5b8d48f (HEAD, foo1) foo1.1
f68bed6 (origin/master, origin/HEAD, master) Initial commit.
$ git checkout master
Switched to branch 'master'
$ cd ..
$ git status
# On branch master
nothing to commit (working directory clean)

Le "superprojet" montre le sous-module sm2 au commit f68bed6mais sm2 a son HEAD sur 5b8d48f. Le commit de sous-module f68bed6a trois branches qui peuvent être utilisées pour l'extraction dans le répertoire du sous-module.

Dan Cruz
la source
MERCI DAN, PERFECTO!
Alec
1

Je voulais ignorer tout changement dans le sous-module et dans mon module également

La commande ci-dessous m'a aidé:

git submodule update --init --recursive
Rajesh Goel
la source