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

153

Je n'arrive pas à me débarrasser du contenu non suivi dans les sous-modules de Git. Fonctionnementgit status des rendements:

# Sur le maître de succursale
# Modifications non préparées pour la validation:
# (utilisez "git add ..." pour mettre à jour ce qui sera validé)
# (utilisez "git checkout - ..." pour annuler les modifications dans le répertoire de travail)
# (valider ou supprimer 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)
#
aucun changement ajouté au commit (utilisez "git add" et / ou "git commit -a")

L'ajout du --ignore-submodulesparamètre masque ces messages; mais je me demande s'il existe un moyen de se débarrasser de cette saleté d'une manière plus appropriée et plus efficace.

Tomer Lichtash
la source
3
Cette réponse: stackoverflow.com/a/5127213/199649 évoque plus d'options.
charlax

Réponses:

98

Étant donné que l'état de git signale du contenu non suivi, le moyen réel d'avoir un statut propre serait d'aller dans chacun de ces sous-modules et:

  • ajouter et valider le contenu non suivi,
  • ou référencer le contenu non suivi dans un .gitignorespécifique à chaque module.
  • ou vous pouvez ajouter le même contenu ignoré aux sous-modules .git/info/exclude, comme le rapporte peci1 dans les commentaires .
  • ou ajouter sale à la spécification sous - module, comme mentionné dans ezraspectre de réponse (upvoted).

    git config -f .gitmodules submodule.<path>.ignore untracked
    
  • ou ajoutez un fichier global .gitignore (souvent ~/.gitignore-global). Comme par exemple .DS_Storeou dans mon cas Carthage/Buildtel que rapporté par Marián Černý dans les commentaires . Voir la .gitginorepage de manuel :

Les modèles qu'un utilisateur souhaite que Git ignore dans toutes les situations (par exemple, sauvegarde ou fichiers temporaires générés par l'éditeur de son choix) vont généralement dans un fichier spécifié par core.excludesFiledans l'utilisateur ~/.gitconfig. Sa valeur par défaut est $XDG_CONFIG_HOME/git/ignore. Si $XDG_CONFIG_HOMEn'est pas défini ou vide, $HOME/.config/git/ignoreest utilisé à la place.

VonC
la source
5
+1, j'étais sur le point de crier jusqu'à ce que je trouve ça ... puis réalisant qu'un .DS_Storefichier avait été créé automatiquement (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...
Courtney Christensen
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 Xcode locales.
Roy Sharon
Si vous ne disposez pas des droits de transmission sur le sous-module, vous ne pouvez pas partager vos modifications du sous-module avec d'autres utilisateurs du référentiel parent. La solution de @ quincyglenn semble fonctionner dans un tel cas.
Drew Noakes
1
@VonC, l'une ou l'autre réponse a du sens en fonction de la situation et de la préférence. Je voulais souligner la distinction ici comme référence à d'autres. BTW merci pour vos nombreuses réponses concernant Git ici sur SO - vous m'avez aidé à maintes reprises.
Drew Noakes le
2
Vous pouvez même vous passer à la fois de la validation et de la création d'un .gitignore (qui lui-même devient non suivi). Ouvrez les sous-modules .git/info/excludeet ajoutez-y les lignes ignorées (cela fonctionne comme un .gitignore, mais ne fait pas partie du référentiel partagé).
Martin Pecka
148

J'ai trouvé que cet article de blog fonctionnait globalement. En ajoutant l' ignore = dirtyoption à chacune des entrées du .gitmodulesfichier.

[submodule "zen-coding-gedit3"]
    path = zen-coding-gedit3
    url = git://github.com/leafac/zen-coding-gedit3.git
    ignore = dirty
ezraspectre
la source
Ma solution préférée, car elle est facilement automatisée.
guitare létale
28
Il convient de mentionner que cela ignore = untrackedexiste également et montre les fichiers suivis modifiés, mais pas les fichiers non suivis. Ce serait bien s'il y avait un paramètre global pour cela pour tous les sous-modules ...
rien101
12

Vous pouvez également accéder à chaque répertoire de sous-module et agir comme un git séparé. Par exemple:

cd my/project/submodule
git status

... / récupère la liste des fichiers modifiés /

git add .  //to add all of them to commit into submodule
git commit -m "message to your submodule repo"

vous pouvez également mettre à jour votre repo de sous-modules distants avec

git submodule update

après tout

Ricardo Martins
la source
5
Vous ne voudrez probablement pas faire git add .sans examiner les fichiers modifiés. La plupart du temps, les modifications apportées sont les .DS_Storefichiers ajoutés - cela devrait probablement être capturé par votre .gitignore, comme Zourtney l'a mentionné dans le premier commentaire de la réponse.
gregoltsov
Si vous ne souhaitez pas mettre à jour les sous-modules et que vous souhaitez revenir à l'état d'origine, vous pouvez exécuter git submodule update --force.
Tom
4

Cela peut être dû à la detached HEADbranche dans votre sous-module. Si tel est le cas, allez dans le chemin de votre sous-module (par exemple:) ./bundle/snipmate, puis exécutez git checkout master.

Browny Lin
la source
3

Cela a très bien fonctionné pour moi:

git update-index --skip-worktree <path>

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

DarkCrazy
la source
2

Je suis resté coincé sur cette question hier, dans un projet qui comportait près de 12 sous-modules.

git status montrait la sortie.

# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#   modified:   proj1 (untracked content)
#   modified:   proj1 (modified content, untracked content)
#   ...

Pour résoudre l'erreur de contenu untracked, je devais supprimer les fichiers non suivis de tous les sous - modules (tous étaient *.pyc, les *.pyofichiers générés par python) en utilisant un.gitignore .

Pour résoudre l'autre, j'ai dû exécuter git submodule updatequi mettait à jour chacun des sous-modules.

mu 無
la source
1

Dans ma situation, je clone des modules comme point de départ pour un nouveau module dans mon environnement ZF2. Ce que cela fait, c'est mettre son propre dossier .git dans le répertoire.

La solution dans ce cas est de supprimer le dossier .git (vous devrez probablement afficher les fichiers cachés pour le visualiser).

HappyCoder
la source
1

Cela se produit probablement lorsque vous avez un autre .git [dossier caché] dans le dossier particulier.

modifié: ./../ .. (contenu modifié, contenu non suivi)

assurez-vous que votre sous-répertoire ne contient pas ce dossier .git.

Si tel est le cas, le problème peut être résolu en supprimant manuellement le dossier .git du sous-répertoire.

Subrat Kumar Palhar
la source
1

Je préfère utiliser SourceTree , donc la solution pour moi était d'ouvrir le dépôt de sous-modules dans SourceTree qui me montre la liste de tous les fichiers non suivis. Je les ai ensuite tous sélectionnés par groupe puis j'ai utilisé "Supprimer".

J'ai pu le faire parce que je savais que tous les fichiers non suivis n'étaient pas vraiment nécessaires.

Glenn Lawrence
la source
-1

S'il s'agit d'un problème temporaire, vous pouvez aller dans le dossier du sous-module et exécuter, git reset HEAD --hardmais vous perdrez toutes vos modifications à l'intérieur du sous-module.

Daigo
la source