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.
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;|
sont tubes , qui transmettent le résultat de la commande précédente à l'entrée de la commande suivante;>>
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
Si vous souhaitez ignorer de manière permanente ces fichiers, un moyen simple de les ajouter à .gitignore
consiste à:
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.
Je l'ai trouvé dans le manuel
git status -uno
-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.
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.
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
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.