Dans un référentiel git, j'ai configuré mon fichier .gitmodules pour référencer un référentiel github:
[submodule "src/repo"]
path = src/repo
url = repourl
quand je 'git status' sur ce repo, ça montre:
On branch master
Your branch is up-to-date with 'Origin/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: src/repo (new commits)
Si je passe en src/repo et que git status sur repo, cela indique qu'il n'y a rien à valider.
Pourquoi mon référentiel git de premier niveau se plaint-il?
C'est parce que les enregistrements Git qui valident (pas une branche ou une balise, exactement une validation représentée dans le hachage SHA-1) doivent être extraits pour chaque sous-module. Si vous modifiez quelque chose dans le répertoire du sous-module, Git le détectera et vous invitera à valider ces modifications dans le répertoire de niveau supérieur.
Courir git diff
dans le référentiel de niveau supérieur pour montrer ce qui a réellement changé selon Git. Si vous avez déjà effectué quelques validations dans votre sous-module (donc "nettoyer" dans le sous-module), il signale le changement de hachage du sous-module.
$ git diff
diff --git a/src/repo b/src/repo
index b0c86e2..a893d84 160000
--- a/src/repo
+++ b/src/repo
@@ -1 +1 @@
-Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea
+Subproject commit a893d84d323cf411eadf19569d90779610b10280
Sinon, il montre -dirty
changement de hachage que vous ne pouvez pas mettre en scène ou valider dans le référentiel de niveau supérieur. git status
affirme également que le sous-module a un contenu non suivi/modifié.
$ git diff
diff --git a/src/repo b/src/repo
--- a/src/repo
+++ b/src/repo
@@ -1 +1 @@
-Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea
+Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea-dirty
$ 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)
(commit or discard the untracked or modified content in submodules)
modified: src/repo (untracked content)
no changes added to commit (use "git add" and/or "git commit -a")
Pour mettre à jour les enregistrements de validation à extraire pour le sous-module, vous devez valider le sous-module en plus de valider les modifications dans le sous-module:
git add src/repo
Je viens de rencontrer cette même classe de problèmes et j'ai pu utiliser la solution proposée par @ AugustinAmenabar dans la section commentaires de la réponse acceptée. Ma configuration était un peu plus complexe, j'ai donc ajouté le --recursive
flag pour mettre à jour toutes les dépendances.
git submodule update src/repo --recursive
Aucune des réponses ici ne résout mon problème.
Je documente/partage ici ce qui a fonctionné pour moi. En espérant que cela aide quelqu'un d'autre.
Au départ, mon sous-module était au commit A (au moment de l'ajout du sous-module au référentiel principal) , puis j'ai vérifié une branche (appelons-la new-submodule-branch
) et y a validé B et C et l'a poussé vers la télécommande (github.com)
Postez ceci, mon référentiel principal a commencé à montrer
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: <submodule_name> (new commits)
Si, à partir de la racine du référentiel principal, j'ai exécuté git submodule update --remote --init --recursive
, il a continué à rétablir le HEAD de mon sous-module à l'état détaché pour valider A
Alors j'ai défini la valeur de branche comme new-submodule-branch
dans <MainRepo>/.gitmodules
comme suit
[submodule "<submodule_name>"]
path = <submodule_name>
url = [email protected]:ProProgrammer/<submodule_name>.git
branch = new-submodule-branch
poster ceci, quand j'ai couru git submodule update --remote --init --recursive
, il ne retournerait plus HEAD à l'état détaché pour valider A de mon sous-module, mais il continuait de montrer l'ennuyeux)
modified: <submodule_name> (new commits)
Jusqu'à présent, je suivais l'officiel référence git pour les sous-modules , maintenant j'ai décidé de faire un peu plus de recherche sur Google, et je suis tombé sur un article intitulé Obtenir un sous-module git pour suivre une branche , cela dit clairement
Vous devez aller mettre à jour cette référence de validation de sous-module vers le dernier code de la branche distante pour éviter cela
Alors finalement, j'ai fait ce que j'essayais d'éviter:
git add <submodule_name>
git commit --amend --no-edit # I combined this with the previous commit where I added the 'branch' value in .gitmodules
Si vous voulez voir à quoi cela ressemble une fois poussé à distance (github.com dans mon cas), vous pouvez voir ce commit exact ici