web-dev-qa-db-fra.com

git: Comment ignorer tous les fichiers non suivis présents?

Existe-t-il un moyen pratique d'ignorer tous les fichiers et dossiers non suivis dans un référentiel git?
(Je connais le .gitignore.)

Donc, git status fournirait à nouveau un résultat net.

112
sjas

Comme cela a déjà été dit, pour exclure du statut, utilisez simplement:

git status -uno  # must be "-uno" , not "-u no"

Si vous souhaitez plutôt ignorer de manière permanente les fichiers actuellement non suivis, vous pouvez lancer depuis la racine de votre projet:

git status --porcelain | grep '^??' | cut -c4- >> .gitignore

Chaque appel ultérieur à git status ignorera explicitement ces fichiers.

UPDATE: la commande ci-dessus présente un inconvénient mineur: si vous n'avez pas encore de fichier .gitignore votre gitignore s'ignorera! Cela est dû au fait que le fichier .gitignore est créé avant l'exécution du git status --porcelain. Donc, si vous n'avez pas encore de fichier .gitignore, je vous recommande d'utiliser:

echo "$(git status --porcelain | grep '^??' | cut -c4-)" > .gitignore

Cela crée un sous-shell qui termine avant le fichier .gitignore est créé.

EXPLICATION DE COMMANDE car je reçois beaucoup de votes (merci!) Je pense que je ferais mieux d'expliquer un peu la commande:

  • git status --porcelain est utilisé à la place de git status --short parce que manuel indique "Donne la sortie dans un format facile à analyser pour les scripts. Ceci est similaire à la sortie courte, mais restera stable à travers les versions de Git et quelle que soit la configuration de l'utilisateur. " Nous avons donc à la fois la capacité d'analyse et la stabilité;
  • grep '^??' ne filtre que les lignes commençant par ??, qui, selon le manuel d'état git , correspondent aux fichiers non suivis;
  • cut -c4- supprime les 3 premiers caractères de chaque ligne, ce qui nous donne simplement le chemin relatif du fichier non suivi;
  • les symboles | sont tubes , qui transmettent le résultat de la commande précédente à l'entrée de la commande suivante;
  • les symboles >> et > sont opérateurs de redirection , qui ajoutent la sortie de la commande précédente à un fichier ou écrase/crée un nouveau fichier, respectivement.

UN AUTRE VARIANT pour ceux qui préfèrent en utilisant sed au lieu de grep et cut , voici une autre manière:

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore
238
Diego

Si vous souhaitez ignorer de manière permanente ces fichiers, un moyen simple de les ajouter à .gitignore consiste à:

  1. Changer à la racine de l'arbre git.
  2. git ls-files --others --exclude-standard >> .gitignore

Cela énumérera tous les fichiers dans les répertoires non suivis, ce qui peut être ou ne pas être ce que vous voulez.

47
poolie

Je l'ai trouvé dans le manuel

git status -uno

15
sjas

-u no ne montre pas non plus les fichiers non staged. -uno fonctionne comme vous le souhaitez et affiche non mis en scène, mais cache sans suivi.

4
football

Deux façons:

utilisez l'argument "-uno" pour git-status. Voici un exemple:

[jenny@jenny_vmware:ft]$ git status
# On branch ft
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       foo
nothing added to commit but untracked files present (use "git add" to track)
[jenny@jenny_vmware:ft]$ git status -uno
# On branch ft
nothing to commit (working directory clean)

Ou vous pouvez ajouter les fichiers et les répertoires directs à .gitignore, auquel cas ils ne s'afficheront jamais.

3
Jenny D

Dans le cas où vous n'êtes pas sous Unix comme OS, cela fonctionnerait sur Windows avec PowerShell

git status --porcelain | ?{ $_ -match "^\?\? " }| %{$_ -replace "^\?\? ",""} | Add-Content .\.gitignore

Cependant, le fichier .gitignore doit avoir une nouvelle ligne vide, sinon il ajoutera du texte à la dernière ligne, peu importe si elle a un contenu.

Cela pourrait être une meilleure alternative:

$gi=gc .\.gitignore;$res=git status --porcelain|?{ $_ -match "^\?\? " }|%{ $_ -replace "^\?\? ", "" }; $res=$gi+$res; $res | Out-File .\.gitignore

2
vhanla

Si vous avez beaucoup de fichiers non suivis et que vous ne voulez pas tous "gitignore", notez que, depuis - git 1.8.3 (22 avril 2013) , git status mentionnera le --untracked-files=no même si vous n'avez pas ajouté cette option en premier lieu!

"git status" suggère aux utilisateurs d'envisager l'utilisation de l'option --untracked=no lorsque l'opération prend trop de temps.

1
VonC