15/11/2024

Commandes et SystèmeLogiciels

Git : Comment résoudre l’erreur « fatal : pathspec is in submodule »

I. Présentation

J’ai récemment réorganisé mes repository Git afin de me faciliter la vie. Plutôt que d’avoir un repository unique PowerShell, un autre Bash, un autre Python, etc, j’ai décidé de me créer un unique repository « Scripts », avec un sous-dossier par langage de scripting : Bash, Python, PowerShell.

J’étais confiant, j’y suis allé à vrai dire un peu vite, et ce qui devait arriver arriva : bim ! Une erreur ! Fatale en plus !

fatal: Pathspec '.\PowerShell\*' is in submodule 'PowerShell'

fatal: Pathspec '.\PowerShell\*' is in submodule 'PowerShell'

Restez avec moi si vous voulez savoir pourquoi cette erreur s’est affichée, et comment la corriger.

II. Prérequis

  • Git installé sur votre poste
  • Un repository distant de configuré (Github, Gitlab, Bitbucket sont les plus connus)

 

III. Explications de l’erreur fatale : Pathspec is in submodule

Jusqu’à aujourd’hui, j’avais 3 dossiers, répartis dans 3 repository Git distincts, pour stocker & gérer mes scripts :

  • Bash-scripts
  • Python
  • PowerShell

J’ai décidé de réunir ces 3 dossiers dans un nouveau repository Git, nommé « Scripts ».

Logiquement, et naïvement, j’ai donc créé un nouveau répertoire « Scripts » sur mon PC, et j’ai copié le contenu des 3 autres dedans, pour me retrouver dans la configuration suivante :

Que du classique lorsqu’on prépare un nouveau répertoire Git.

Me restait donc à initialiser le suivi du répertoire via Git :

cd E:\Repos\Scripts

git init

Une fois fait, il faut encore dire à Git quels sont les fichiers sur lesquels tracker les modifications. Ça s’effectue via la commande :

git add .

NOTE : Le . agit comme un ./* Il indique à Git de tracker tous les fichiers & sous-répertoires présents dans le répertoire de travail actuel.

 

Et c’est à ce moment-là que ça a commencé à coincer.

Mon dossier PowerShell était déjà tracké par Git, dans un autre repository, et il possédait toujours un dossier .git, avec la configuration associée.

Comme vous pouvez le voir sur la capture d'écran ci-dessous, les messages de git sont en général assez parlant. Dans notre cas, la solution nous est donnée. Enfin presque. Je vous dit tout dans un instant.

À ce stade, si vous vous entêtez, lors de votre premier commit, votre dossier « PowerShell » sera purement et simplement ignoré par Git.

Pourtant, le commit se passe bien, sans erreur.

 

Sauf que voilà : j’ai beau effectuer des modifications dans mon dossier PowerShell, git est censé les détecter, et m’afficher les changements lorsque j’utilise les commandes suivantes :

git diff

git status

Or, dans mon cas, Git me retourne un message m'indiquant qu'il n'y a eu aucun changement, et qu'il n'y a donc aucun intérêt à réaliser un commit : "nothing to commit, working tree clean".

nothing to commit, working tree clean

Et côté repository distant, sur Gitlab, je me retrouve avec un dossier PowerShell inaccessible alors que je devrais pouvoir le parcourir et avoir accès à tous mes scripts.

Vraiment, la loose !

Il y a une manière très simple de vérifier si vous avez bien la même erreur que moi. Essayez de rajouter le dossier ou le fichier dans les éléments trackés par Git :

git add ./PowerShell/*

Vous devriez alors obtenir l'erreur "fatal: Pathspec is in submodule".

fatal: Pathspec is in submodule

 

Et voilà : l’explication, c’est que mon dossier PowerShell contenait une configuration git existante. Donc lorsque j’ai initialisé git pour mon nouveau dossier Scripts, le dossier PowerShell, qui était déjà tracké, s’est automatiquement configuré en sous-module. Git considère alors que ce dossier PowerShell étant déjà suivi et ayant déjà des commit, il n'a aucun intérêt à le suivre une seconde fois, d'où le message d'erreur, et d'où le fait que mes modifications ne sont absolument pas détectées lorsque je fais un commit git.

IV. Comment corriger cette erreur ?

Maintenant, comment corriger cette erreur ? C’est très simple et ça ne vous prendra pas plus de 30 secondes.

Pour commencer, supprimez le dossier .git de votre dossier « PowerShell » s’il est encore présent.

Ensuite, vous allez faire oublier à Git le tracking de votre dossier en mode « submodule », en forçant git à supprimer son cache :

git rm --cached <nom-du-dossier>

 

NOTE : Si git est récalcitrant, vous pouvez utiliser le paramètre -f pour le forcer à supprimer son cache.

git rm --cached <nom-du-dossier> -f

 

Vous pouvez alors à nouveau ajouter le tracking git de votre dossier, et vérifier que les fichiers sont cette fois bien reconnus :

git add ./PowerShell/*

git status

Cette fois, on peut bien voir les modifications que j'ai apportées au contenu du dossier PowerShell : en vert les fichiers ajoutés (du point de vue de Git, par rapport au dernier commit).

Il ne vous reste plus qu’à faire votre git push pour envoyer vos données sur votre repository distant, et le tour est joué. ?

V. Conclusion

La prochaine fois que vous voudrez réorganiser vos repository Git, n’oubliez pas de vérifier la configuration Git du repository en question, afin d’éviter de créer par inadvertance des sous-modules là où il n’y en a pas besoin.

Pensez également à bien vérifier que tous les dossiers et fichiers qui vous intéressent sont bien intégrés à la liste des éléments trackés par Git, via la commande :

git status

Et si votre commit coince, votre premier réflexe est d’aller voir l’état de votre repository sur votre serveur distant, et également de regarder la configuration de votre repository Git local dans votre dossier .git.

author avatar
Thibault Baheux Responsable Infrastructure IT
Responsable Infrastructure IT, Geek, Manager de geeks, Je travaille au quotidien sur une infra Cloud privée / Cloud Azure, aussi bien Windows que Linux. Je me passionne pour Azure, la sécurité IT, le management de projets & la programmation objet (PowerShell / Python). Si je ne suis pas derrière mon clavier, vous me trouverez dans une salle de blocs ou devant un bon mur d’escalade.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.