web-dev-qa-db-fra.com

Comment rétablir un pointeur de sous-module Git sur la validation stockée dans le référentiel contenant?

J'ai un sous-module Git dans mon dépôt principal Git. Si je comprends bien, le référentiel principal stocke une valeur SHA (quelque part ...), indiquant le commit spécifique du sous-module auquel il est "lié".

Je suis entré dans mon sous-module et ai tapé git checkout some_other_branch. Je ne sais pas de quel commit je viens.

Je voudrais inverser ce pointeur afin que le référentiel principal et le sous-module soient à nouveau synchronisés.

Mon premier instinct (probablement naïf) fut 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, notez l'ID SHA qu'avait le pointeur de sous-module, puis allez dans le sous-module et git checkout [SHA ID]... mais il doit sûrement y avoir un moyen plus facile?

Comme je suis encore en train d’apprendre sur les sous-modules git, n'hésitez pas à corriger ma terminologie s’il existe des mots pour des concepts que je ne connais pas.

108
Smashery

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 de mise à jour:

Depuis la page de manuel du sous-module:

 Mettez à jour les sous-modules enregistrés, c’est-à-dire clonez les sous-modules manquants et 
 Extrayez le commit spécifié dans l’index du référentiel contenant 
. Ainsi, les sous-modules HEAD seront détachés à moins que 
 - rebase ou --merge soit spécifié ou que le sous-module clé. $ Name.update 
 Soit défini sur rebase. ou fusionner. 

Exécutez ceci et tout devrait bien se passer:

git submodule update
147
Brian Riehman

Pour modifier le commit sur lequel pointe un sous-module, vous devez extraire cette version dans le sous-module, puis revenir au référentiel contenant, ajouter et valider cette modification.

Ou, si vous souhaitez que le sous-module se trouve sur la version indiquée par le haut dépôt, faites git submodule update --recursive. Ajoutez --init Si vous venez de cloner.

En outre, git submodule Sans commande de sous-module vous montrera le commit que vous indiquez. Il y aura un - ou un + devant le commit si ce n'est pas synchronisé.

Si vous regardez un arbre avec un sous-module, vous pouvez voir que le sous-module est marqué comme un commit par opposition au reste qui sont des blobs ou des arbres.

pour voir ce qu’un commet en particulier vous permet de:

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

vous pouvez ensuite voir le commit ou toute autre chose si vous le souhaitez en le passant dans log, etc. (l'option git-dir au niveau de la commande git vous permet de ne pas avoir à vous connecter au sous-module):

git --git-dir=Submodule/path log -1 $(<the above statement>)
20
Adam Dymitruk

Utilisation 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 utilisez git log --oneline --decorate pour voir sur quelle branche se trouve le commit original. Finalement, git checkout original-commit-branch.

À l'aide de 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" affiche le sous-module sm2 à commit f68bed6 mais sm2 a c'est HEAD à 5b8d48f. Le sous-module commit f68bed6 comporte trois branches qui peuvent être utilisées pour le paiement dans le répertoire du sous-module.

5
Dan Cruz

Un autre cas que je viens de rencontrer est celui des modifications que vous souhaitez supprimer dans le sous-module. La mise à jour de sous-module git ne supprimera pas cette modification, ni git reset --hard dans le répertoire parent. Vous devez aller dans le répertoire du sous-module et faire une réinitialisation de git --hard. Par conséquent, si je souhaite supprimer complètement les modifications non mises en scène de mon parent et de mon sous-module, je procède comme suit:

En parent:

git reset --hard

git submodule update

En sous-module:

git reset --hard
5

La réponse ici n’a pas résolu mon problème spécifique avec le sous-module, alors si cela vous arrivait aussi, essayez ce qui suit ...

 git submodule foreach git reset --hard

https://kalyanchakravarthy.net/blog/git-discard-submodule-changes/

3
MichaelChan

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

La commande ci-dessous m'a aidé:

mise à jour du sous-module git --init --recursive

0
Rajesh Goel