git: Wie ignoriere ich alle vorhandenen nicht verfolgten Dateien?


131

Gibt es eine praktische Möglichkeit, alle nicht verfolgten Dateien und Ordner in einem Git-Repository zu ignorieren?
(Ich weiß über die .gitignore.)

So git statuswürde wieder ein sauberes Ergebnis.



Oder Sie möchten Ihrer .gitignore-Datei ein einzelnes * hinzufügen. :)
Vilicvane

1
Nur ein *Wille ist sehr wahrscheinlich nicht das, was Sie wollen.
Sjas


Überrascht von so vielen falschen Antworten. -u noist falsch. -unoist richtig. -u noversucht, einen Status für eine Datei namens no! Das noist kein Argument dafür -u. Um nodie Interpretation als Argument zu erzwingen -u, darf kein Leerzeichen vorhanden sein. Um dies zu testen, tun Sie touch Invalidund vergleichen Sie git status -uInvalidmit git status -u Invalid.
Aaron McDaid

Antworten:


251

Wie bereits gesagt, um vom Status auszuschließen, verwenden Sie einfach:

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

Wenn Sie stattdessen aktuell nicht verfolgte Dateien dauerhaft ignorieren möchten, können Sie im Stammverzeichnis Ihres Projekts Folgendes starten:

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

Bei jedem nachfolgenden Aufruf von git statuswerden diese Dateien explizit ignoriert.

UPDATE : Der obige Befehl hat einen kleinen Nachteil: Wenn Sie noch keine .gitignoreDatei haben, ignoriert sich Ihr Gitignore selbst! Dies geschieht, weil die Datei .gitignoreerstellt wird, bevor die git status --porcelainausgeführt wird. Wenn Sie noch keine .gitignoreDatei haben, empfehle ich Folgendes:

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

Dadurch wird eine Unterschale erstellt, die vor dem Erstellen der .gitignoreDatei abgeschlossen wird.

BEFEHLSERKLÄRUNG, da ich viele Stimmen bekomme (danke!) Ich denke, ich sollte den Befehl besser ein wenig erklären:

  • git status --porcelainwird anstelle von verwendet, git status --shortweil manuelle Zustände "Geben Sie die Ausgabe in einem einfach zu analysierenden Format für Skripte an. Dies ähnelt der kurzen Ausgabe, bleibt jedoch über Git-Versionen hinweg und unabhängig von der Benutzerkonfiguration stabil." Wir haben also sowohl die Analysefähigkeit als auch die Stabilität;
  • grep '^??'filtert nur die Zeilen ??, die mit beginnen , die laut Git-Status-Handbuch den nicht verfolgten Dateien entsprechen;
  • cut -c4- Entfernt die ersten 3 Zeichen jeder Zeile, wodurch nur der relative Pfad zur nicht verfolgten Datei angegeben wird.
  • Die |Symbole sind Pipes , die die Ausgabe des vorherigen Befehls an die Eingabe des folgenden Befehls übergeben.
  • Die Symbole >>und >sind Umleitungsoperatoren , die die Ausgabe des vorherigen Befehls an eine Datei anhängen oder eine neue Datei überschreiben / erstellen.

Eine weitere Variante für diejenigen, die es vorziehen ,sed anstelle von grepund zu verwenden cut, hier ist ein anderer Weg:

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

3
cut -c4- Entfernt die ersten 4 Zeichen jeder Zeile, wodurch nur der relative Pfad zur nicht verfolgten Datei angegeben wird. Nr. -cMarkiert den Anfang einer Liste der zu schneidenden Spaltennummern. Und 4- wählt die Zeile von Spalte 4 bis zum Ende aus, wodurch die Spalten 1-3 abgeschnitten werden. Ihr Befehl zum Ausschneiden entfernt also tatsächlich die ersten 3 Zeichen jeder Zeile. Wenn Sie 4 Zeichen aus einer Git-Statuszeile wie der für diese Datei hier ?? app/views/static_pages/contact.html.erbentfernen würden, würden Sie den ersten Buchstaben von entfernen app. Der Befehl ist also korrekt, aber die Erklärung ist fehlerhaft.
7stud

@ 7stud: danke, du hast recht, ich habe versehentlich 4 geschrieben. Ich habe die Antwort korrigiert.
Diego

2
Ich schätze die Befehlserklärung sehr. Es ist schön zu wissen, was die zufälligen Befehle tun, die ich aus dem Internet kopiert habe, und hilft uns allen, den Umgang mit der Kommandozeile und Git besser zu lernen.
Eric Fitting

1
-u nofunktioniert bei mir nicht Aber -unotut es. Ich habe die Antwort entsprechend aktualisiert. Das ist seltsames Design für Git. Ich bin auf Git 1.7.1
Aaron McDaid

2
@ AaronMcDaid: Danke. Die Änderung wird hier dokumentiert und hier
Diego

51

Wenn Sie diese Dateien dauerhaft ignorieren möchten, können Sie sie auf einfache Weise hinzufügen .gitignore:

  1. Wechseln Sie zur Wurzel des Git-Baums.
  2. git ls-files --others --exclude-standard >> .gitignore

Dadurch werden alle Dateien in nicht verfolgten Verzeichnissen aufgelistet, die möglicherweise Ihren Wünschen entsprechen oder nicht.


3
Warum bekommt das nicht so viele Stimmen? Keine Notwendigkeit, 2 andere Programme durchzuleiten!
JoelFan

4
@JoelFan: zwei Gründe: 1) Dieser funktioniert nur von der Wurzel des Git aus , während der akzeptierte von jedem Unterverzeichnis aus funktioniert. Sie müssen nur den Zielpfad anpassen. .gitignore2) Wenn Sie ein nicht verfolgtes Verzeichnis haben, listet dieses jeweils und auf Jede einzelne Datei darin, aber nicht das nicht verfolgte Verzeichnis selbst (damit Sie das Verzeichnis nicht ignorieren und zukünftige Dateien im Verzeichnis weiterhin als nicht verfolgt gemeldet werden, während die akzeptierte Datei nur das Verzeichnis und nicht die darin nicht verfolgten Dateien auflistet Dies ist eine Frage dessen, was Sie tun möchten, aber oft möchten Sie einfach das ganze Verzeichnis ignorieren
Diego

1
Danke poolie ich den Unterschied zu schätzen weiß von Ihrem Vorschlag wegen der von @Diego I genannten Punkten zu arbeiten begann mit einer Bibliothek von Dateien und Ordnern , und ich mag nicht auf die Originaldateien verfolgen / drücken. Ich möchte nur Dateien verfolgen, die ich in der Bibliothek hinzufüge oder neu erstelle. Das Hinzufügen der übergeordneten Ordner würde alles ignorieren. Diese / Ihre Lösung fügte alle 1696 Dateien im Handumdrehen hinzu. xD
Chaos7703

Dies kann auch mit erreicht werden git config status.showUntrackedFiles no.
Larsch

16

Fand es im Handbuch

Der Parameter mode wird verwendet, um die Behandlung von nicht verfolgten Dateien anzugeben. Es ist optional: Standardmäßig werden alle verwendet, und wenn angegeben, muss es an der Option festhalten (z. B. -uno, aber nicht -u nein).

git status -uno


39
Nun, wenn jeder vor dem Posten RTFM würde, würde keiner von uns jemals einen Repräsentanten bekommen :-)
Jenny D

4

Zwei Wege:

Verwenden Sie das Argument "-uno" für den Git-Status. Hier ist ein Beispiel:

[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)

Oder Sie können die Dateien und Verzeichnisse zu .gitignore hinzufügen. In diesem Fall werden sie nie angezeigt.


2
Eine praktische Möglichkeit, das .gitignoreWesen zu bearbeiten git status | cat >> temp && vim temp. Bearbeiten Sie dann die Datei so, dass die ersten und letzten Zeilen sowie die nachfolgenden #und die Leerzeichen danach gelöscht werden . Dann cat temp >> .gitignore && rm temp. Falls noch keine .gitignorevorhanden war, reicht mv temp .gitignoredies aus. Hässliches Zeug, aber besser als das .gitignoremanuelle Aktualisieren .
Sjas

1
Diese Antwort ist falsch. Die richtige Antwort lautet -uno. Wenn Sie verwenden -u no, entspricht dies no -u- es wird ein Status für eine aufgerufene Datei no(die wahrscheinlich nicht vorhanden ist) ausgeführt und der Standardmodus verwendet -u. dh es ist gleichbedeutend mitgit status no
Aaron McDaid

3

-u nozeigt auch keine nicht bereitgestellten Dateien an. -unofunktioniert wie gewünscht und zeigt nicht inszeniert, versteckt sich aber nicht verfolgt.


1
Auch das ist nicht ganz richtig. git status -u Xist äquivalent zu git status X -u( Xist kein Argument für -u). Dies ist wiederum äquivalent zu git status X(weil -uohne Argument die Standardeinstellung ist -u). Daher ist es einfach ein Git-Status in der Datei X. Also, wenn Xist noes einfach versucht , einen Git - Status auf einer Datei zu tun genannt no, die Sie haben wahrscheinlich nicht
Aaron McDaid

2

Wenn Sie nicht unter einem Unix-ähnlichen Betriebssystem arbeiten, funktioniert dies unter Windows mit PowerShell

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

Die .gitignoreDatei muss jedoch eine neue leere Zeile haben, andernfalls wird Text an die letzte Zeile angehängt, unabhängig davon, ob sie Inhalt enthält.

Dies könnte eine bessere Alternative sein:

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


1

Wenn Sie eine Menge untracked - Dateien und wollen nicht zu „ gitignore“ alle von ihnen zu beachten , dass, da git 1.8.3 (April, 22. 2013) , git statuswird das erwähnen , --untracked-files=noauch wenn Sie diese Option nicht in die hinzugefügt haben erster Platz!

" git status" schlägt Benutzern vor, die Verwendung der --untracked=noOption zu prüfen, wenn dies zu lange dauert.


0

Ich bin hierher gekommen, um ein etwas anderes Problem zu lösen. Vielleicht ist dies für jemand anderen nützlich:

Ich erstelle einen neuen Zweig feature-a. Als Teil dieses Zweigs erstelle ich neue Verzeichnisse und muss .gitignore ändern, um einige davon zu unterdrücken. Dies passiert häufig, wenn einem Projekt neue Tools hinzugefügt werden, mit denen verschiedene Cache-Ordner erstellt werden. .serverless, .terraformUsw.

Bevor ich bereit bin, das wieder mit dem Master zusammenzuführen, ist noch etwas anderes aufgetaucht, also checke ich mastererneut aus, git statusnehme aber jetzt diese unterdrückten Ordner wieder auf, da der .gitignore noch nicht zusammengeführt wurde.

Die Antwort hier ist eigentlich einfach, obwohl ich diesen Blog finden musste, um es herauszufinden:

Checken Sie einfach die .gitignore-Datei aus dem feature-aZweig aus

git checkout feature-a -- feature-a/.gitignore
git add .
git commit -m "update .gitignore from feature-a branch"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.