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.
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
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>)
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.
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
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/
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