178 votes

Comment se débarrasser du statut non suivi des sous-modules Git ?

Je ne parviens pas à me débarrasser du contenu non suivi dans les sous-modules de Git. Lorsque je lance git status, j'obtiens :

\# Sur la branche master
# Modifications qui ne seront pas validées :
#   (utilisez "git add ..." pour mettre à jour ce qui sera validé)
#   (utilisez "git checkout -- ..." pour annuler les modifications dans le répertoire de travail)
#   (validez ou annulez le contenu non suivi ou modifié dans les sous-modules)
#
#    modifié :   bundle/snipmate (contenu non suivi)
#    modifié :   bundle/surround (contenu non suivi)
#    modifié :   bundle/trailing-whitespace (contenu non suivi)
#    modifié :   bundle/zencoding (contenu non suivi)
#
Aucune modification n'a été ajoutée pour le commit (utilisez "git add" et/ou "git commit -a")

Ajouter le paramètre --ignore-submodules permet de masquer ces messages. Cependant, je me demande s'il existe un moyen de se débarrasser de cette saleté de manière plus appropriée, plus conforme au fonctionnement de base de Git.

3 votes

Cette réponse: stackoverflow.com/a/5127213/199649 évoque plus d'options.

0 votes

166voto

ezraspectre Points 1083

J'ai trouvé ce article de blog globalement utile. En ajoutant l'option ignore = dirty à chacune des entrées du fichier .gitmodules.

[submodule "zen-coding-gedit3"]
    path = zen-coding-gedit3
    url = git://github.com/leafac/zen-coding-gedit3.git
    ignore = dirty

0 votes

Ma solution préférée, car elle est facilement automatisée.

34 votes

Il convient de mentionner que ignore = untracked existe également et affiche les fichiers suivis modifiés, mais pas les fichiers non suivis. Ce serait bien s'il existait un paramètre global pour cela pour tous les sous-modules...

1 votes

Sans surprise, après près d'une décennie, le lien vers l'article de blog est mort. :)

110voto

VonC Points 414372

Comme le rapporte l'état git des contenus non suivis, la manière réelle d'avoir un état propre serait d'entrer dans chacun de ces sous-modules et :

  • ajouter et valider les contenus non suivis,

  • ou référencer les contenus non suivis dans un fichier .gitignore spécifique à chaque module.

  • ou vous pouvez ajouter le même contenu ignoré au .git/info/exclude du sous-module, comme le signale peci1 dans les commentaires.

  • ou ajouter dirty à la spécification du sous-module, comme mentionné dans la réponse de ezraspectre (upvotée).

    git config -f .gitmodules submodule..ignore non_suivi
  • ou ajouter un fichier global .gitignore (souvent ~/.gitignore-global). Comme par exemple .DS_Store ou dans mon cas Carthage/Build comme l'a signalé Marián Černý dans les commentaires. Voir la page man de .gitginore:

Les motifs que l'utilisateur veut que Git ignore dans toutes les situations (par exemple, les fichiers de sauvegarde ou temporaires générés par l'éditeur privilégié de l'utilisateur) vont généralement dans un fichier spécifié par core.excludesFile dans le ~/.gitconfig de l'utilisateur. Sa valeur par défaut est $XDG_CONFIG_HOME/git/ignore. Si $XDG_CONFIG_HOME n'est pas défini ou est vide, $HOME/.config/git/ignore est utilisé à la place.

6 votes

+1, j'étais sur le point de crier jusqu'à ce que je trouve cela... puis réaliser qu'un fichier .DS_Store avait été automatiquement créé (par OS X) dans l'un de mes sous-modules, m'empêchant de valider le projet principal. Arg! Il est temps de mettre à jour .gitignore...

0 votes

En utilisant Xcode, j'ai également trouvé utile d'ajouter *.xcuserdatad au fichier .gitignore-global. Cela empêche git d'essayer de suivre les préférences locales de Xcode.

0 votes

Si vous n'avez pas les droits de pousser dans le sous-module, vous ne pouvez pas partager vos modifications apportées au sous-module avec les autres utilisateurs du dépôt parent. La solution de @quincyglenn semble fonctionner dans un tel cas.

18voto

Ricardo Martins Points 1249

Vous pouvez également vous rendre dans chaque répertoire de sous-module et agir comme un git séparé. Par exemple:

cd mon/projet/sous-module
git status

... /obtient la liste des fichiers modifiés/

git add .  //pour ajouter tous les fichiers à valider dans le sous-module
git commit -m "message à envoyer à votre dépôt de sous-module"

vous pouvez également mettre à jour votre dépôt de sous-module distant avec

git submodule update

après tout

5 votes

Vous ne voulez probablement pas faire git add . sans examiner les fichiers modifiés. La plupart du temps, les modifications qui ont été apportées sont les fichiers .DS_Store ajoutés - cela devrait probablement être pris en compte par votre .gitignore, comme zourtney l'a mentionné dans le premier commentaire à la réponse.

2 votes

Dans le cas où vous ne vouliez réellement pas mettre à jour les sous-modules et que vous souhaitiez revenir à l'état d'origine, vous voudrez peut-être exécuter git submodule update --force.

9voto

DarkCrazy Points 384

Cela a très bien fonctionné pour moi :

git update-index --skip-worktree 

Si cela ne fonctionne pas avec le pathname, essayez le nom du fichier. Faites-moi savoir si cela a fonctionné pour vous aussi.

4voto

Browny Lin Points 437

Cela pourrait être dû au detached HEAD dans votre branche de sous-module. Si tel est le cas, accédez à votre chemin de sous-module (par exemple : ./bundle/snipmate), puis exécutez git checkout master.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X