Le sous-module Git affiche les nouveaux commits, le statut du sous-module ne dit rien à commettre

47

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, cela indique:

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 cd dans src / repo et que git status est sur repo, cela signifie qu'il n'y a rien à commettre.

Pourquoi mon dépôt de premier niveau git se plaint-il?

Catherine Holloway
la source

Réponses:

42

C'est parce que les enregistrements Git qui commettent (pas une branche ou une balise, mais un seul commit représenté 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.

Exécutez-le git diffdans le référentiel de niveau supérieur pour afficher ce qui a réellement changé, selon Git. Si vous avez déjà effectué des commits dans votre sous-module (donc "nettoyer" dans le sous-module), il indique 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 indique un -dirtychangement de hachage que vous ne pouvez ni mettre en scène ni valider dans le référentiel de niveau supérieur. git statusaffirme é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 quels enregistrements de validation doivent être extraits pour le sous-module, vous devez également valider le sous-module en plus des modifications apportées dans le sous-module:

git add src/repo
yaegashi
la source
1
Et si je ne veux pas ajouter de commits dans le référentiel principal? Mon cas d'utilisation est - j'ai un référentiel principal, puis j'ai son wiki qui est aussi un référentiel (disponible dans GitHub et Bitbucket). Maintenant, j'ai ajouté le en wikitant que sous-module dans un répertoire wiki . Je ne veux pas que mes modifications du répertoire wiki(c'est-à-dire du répertoire wiki ) soient reflétées dans mon référentiel principal / code. Devrais-je simplement ajouter le .gitmodules chemin dans .gitignorele répertoire principal? Comment dois-je m'y prendre?
Yadav_vi
14
Dans mon cas, tout ce que j'avais à faire était de mettre à jour le sous-module lui-même à partir du référentiel principal. Quelque chose comme:git submodule update src/repo
Agustín Amenabar
19

Je viens de rencontrer ce même type 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 étant un peu plus complexe, j'ai ajouté le --recursivedrapeau pour mettre à jour toutes les dépendances.

git submodule update src/repo --recursive

Zak
la source