Git: listet nur "nicht verfolgte" Dateien auf (auch benutzerdefinierte Befehle)

339

Gibt es eine Möglichkeit, mit einem Befehl git ls-filesnur nicht verfolgte Dateien anzuzeigen?

Der Grund, den ich frage, ist, dass ich den folgenden Befehl verwende, um alle gelöschten Dateien zu verarbeiten:

git ls-files -d | xargs git rm

Ich hätte gerne etwas Ähnliches für nicht verfolgte Dateien:

git some-command --some-options | xargs git add

Ich konnte die -oOption dazu finden git ls-files, aber das ist nicht das, was ich will, weil es auch ignorierte Dateien anzeigt. Ich konnte mir auch den folgenden langen und hässlichen Befehl einfallen lassen:

git status --porcelain | grep '^??' | cut -c4- | xargs git add

Es scheint, als müsste es einen besseren Befehl geben, den ich hier verwenden kann. Und wenn nicht, wie erstelle ich benutzerdefinierte Git-Befehle?

Wir sind alle Monica
quelle
Könnten Sie näher erläutern, warum Sie brauchen git ls-files -d | xargs git rm?
Takeshin
Dadurch werden alle Dateien entfernt, bei denen Git-Hinweise fehlen. Meine Frage war, wie man einen verwandten Vorgang ausführt - füge alle Dateien hinzu, die git derzeit nicht verfolgt. Normalerweise mache ich beides, nachdem ich meine Codedateien umbenannt, kombiniert und / oder aufgeteilt habe.
Wir sind alle Monica
Wenn sie fehlen, werden sie dann nicht bereits gelöscht? Es sei denn ... Sie haben von einem anderen Ort gezogen und dann versucht, mit der Fernbedienung zu synchronisieren ... Ich glaube, ich verstehe.
Buttle Butkus
Ich habe alle Antworten getestet. Wenn ein leerer, nicht verfolgter Ordner vorhanden ist, kann ihn niemand finden.
Kittygirl
@ Kittygirl das ist richtig. Da dies gitnur für Dateien funktioniert, können leere Ordner nicht nachverfolgt werden. Versuchen Sie es find . -type d -emptystattdessen.
Wir sind alle Monica

Antworten:

529

Um nicht verfolgte Dateien aufzulisten, versuchen Sie:

git ls-files --others --exclude-standard

Wenn Sie die Ausgabe an weiterleiten müssen, xargssollten Sie Leerzeichen mit git ls-files -zund beachten xargs -0:

git ls-files -z -o --exclude-standard | xargs -0 git add

Netter Alias ​​zum Hinzufügen von nicht verfolgten Dateien:

au = !git add $(git ls-files -o --exclude-standard)

Bearbeiten: Als Referenz: git-ls-files

Takeshin
quelle
7
Perfekt! Was bedeutet das !am Anfang der Aliaszeile oder wo ist das dokumentiert?
Wir sind alle Monica
@takeshin Wie bekomme ich nur übergeordnete Verzeichnisnamen? keine Unterordner. Bedeutet in diesen nicht verfolgten Dateien: / P / a / Dateien, / P / a / Bilder, / P / a / / P /, ... - Ich möchte nur / P /
Dr.jacky
2
In welcher Situation würden Sie den Alias ​​benötigen? git add *wird das Gleiche tun: Fügen Sie alle nicht verfolgten Dateien mit Ausnahme des Standards hinzu (Dateien, deren Pfade abgedeckt sind .gitignore).
toinetoine
1
Ich bevorzuge, dass mein Alias ​​in allen Verzeichnissen im Repo konsistent funktioniert (der Befehl ls-files zeigt nur geänderte Dateien im aktuellen Baum an), also habe ich[alias] lso = "!f() { cd $(git rev-parse --show-toplevel); git ls-files -o; }; f"
qneill
Vielen Dank. Guter Kommentar.
Darth Egregious
71

Wenn Sie nur nicht verfolgte Dateien entfernen möchten, gehen Sie folgendermaßen vor:

git clean -df

Fügen xSie dies hinzu , wenn Sie auch speziell ignorierte Dateien einschließen möchten. Ich benutze git clean -dfxeine Menge im Laufe des Tages.

Sie können ein benutzerdefiniertes Git erstellen, indem Sie einfach ein Skript mit dem Namen schreiben git-whateverund es in Ihrem Pfad haben.

Dustin
quelle
Es ist viel üblicher, dass ich alle nicht verfolgten Dateien hinzufügen möchte (z. B. nachdem ich einige Dinge verschoben habe). Auf jeden Fall danke für den Tipp zu benutzerdefinierten Befehlen. Wo ist dieser Mechanismus dokumentiert?
Wir sind alle Monica
5
Tun Sie es einfach git add -Aoder git add -u(je nachdem, was für Sie sinnvoller ist)
Dustin
1
Ihr Kommentar ist die eigentliche Antwort, die auch später von @Mike Lococo
andho
2
und "git clean -dfxn" für einen Trockenlauf durch Hinzufügen von "n"
charo
50

git add -A -nwird tun was du willst. -AFügt dem Repo alle nicht verfolgten Dateien hinzu und -nmacht es zu einem Ort, an dry-rundem das Hinzufügen nicht durchgeführt wird, aber die Statusausgabe wird angezeigt, indem jede Datei aufgelistet wird, die hinzugefügt worden wäre.

Mike Lococo
quelle
7
Das ist eine großartige Antwort! Beachten Sie, dass Dateien in .gitignoreDateien ausgeschlossen werden. Dies ist normalerweise das, was wir wollen, aber wenn nicht git add -fAn.
cdunn2001
1
Dies scheint die beste Antwort zu sein.
Rob Grant
1
Dies ist die beste Antwort. Es teilt dem Benutzer explizit mit, was es tun würde (ohne es zu tun), und gibt ihm die Möglichkeit, es zu überprüfen, bevor es tatsächlich hinzugefügt wird. Perfekt. Vielen Dank!
Digitguy
Es werden auch geänderte Dateien aufgelistet.
Frank-Rene Schäfer
schön, aber ich bekomme es verpackt : add '$file'. Während git ls-files --exclude-standard -ogibt eine bloße Ausgabe, Rohrleitung heiß.
Hyperpallium
28

Die akzeptierte Antwort stürzt bei Dateinamen mit Leerzeichen ab. Ich bin mir zu diesem Zeitpunkt nicht sicher, wie ich den Alias-Befehl aktualisieren soll. Daher werde ich die verbesserte Version hier einfügen:

git ls-files -z -o --exclude-standard | xargs -0 git add
youurayy
quelle
Ich denke, dies ist die richtige Antwort, da sie den Pfad jeder Datei bereitstellt, um anschließend eine Aktion (wie git add) auf sie auszuführen
Pablo Burgos
27

Alles ist sehr einfach

Um eine Liste aller nicht verfolgten Dateien zu erhalten, verwenden Sie den Befehl git status mit der Option -u (--untracked-files).

git status -u
Valentyna
quelle
Wie wäre es mit einer nicht rekursiven Version davon?
David
Leider werden auch Dateien aufgelistet, die durch Gitignore-Dateien ignoriert werden.
Plouff
8
Dies ist die einzige Antwort, die meine ignorierten Dateien beim ersten Festschreiben zeigte, aber ich musste --ignoreddem git status -uBefehl hinzufügen
DN
Das ist einfach und schön.
Eric Wang
1
Diese auch zeigt Dateien geändert. Also keine Antwort auf die Frage: Nur nicht verfolgte Dateien anzeigen.
Wildcard
6

Bei der Suche nach Dateien, die möglicherweise hinzugefügt werden sollen. Die Ausgabe von git showmacht das, aber es enthält auch viele andere Dinge. Der folgende Befehl ist nützlich, um dieselbe Liste von Dateien abzurufen, jedoch ohne alle anderen Dinge.

 git status --porcelain | grep "^?? " | sed -e 's/^[?]* //'

Dies ist nützlich, wenn es in einer Pipeline kombiniert wird, um Dateien zu finden, die einem bestimmten Muster entsprechen, und diese dann an weiterzuleiten git add.

git status --porcelain | grep "^?? "  | sed -e 's/^[?]* //' | \
egrep "\.project$|\.settings$\.classfile$" | xargs -n1 git add
cmac
quelle
6

Ich weiß, dass es eine alte Frage ist, aber in Bezug auf die Auflistung nicht verfolgter Dateien dachte ich, ich würde eine weitere hinzufügen, die auch nicht verfolgte Ordner auflistet:

Sie können die Git-Clean-Operation mit -n (Trockenlauf) verwenden, um anzuzeigen, welche Dateien entfernt werden (einschließlich der Gitignore-Dateien), indem:

git clean -xdn

Dies hat den Vorteil, dass alle Dateien und Ordner angezeigt werden , die nicht verfolgt werden. Parameter:

  • x - Zeigt alle nicht verfolgten Dateien an (einschließlich von Git und anderen ignorierter Dateien, wie Build-Ausgabe usw.)
  • d - Nicht verfolgte Verzeichnisse anzeigen
  • n- und vor allem! - dryrun, dh nichts löschen, einfach den Bereinigungsmechanismus verwenden, um die Ergebnisse anzuzeigen.

Es kann ein bisschen unsicher sein, es so zu machen, wenn Sie das vergessen -n. Also alias ich es normalerweise in git config.

code_fodder
quelle
2

Alle vorherigen Antworten, die ich überprüft habe, würden auch die Dateien auflisten, die festgeschrieben werden sollen. Hier ist eine einfache Lösung, die nur Dateien auflistet, die sich noch nicht im Repo befinden und nicht unterliegen .gitignore.

git status --porcelain | awk '/^\?\?/ { print $2; }'

oder

git status --porcelain | grep -v '\?\?'
Frank-Rene Schäfer
quelle
Dies scheint nicht gut mit Dateien zu funktionieren, deren Name ein Leerzeichen enthält
ssc
-2

Ich denke, das wird so sein wie das Originalplakat:

git add .

Tim Fulmer
quelle
2
Jedes Mal git/svn add ., wenn Sie dies tun , stirbt das Kätzchen.
Nakilon
Heh, nur wenn du ein paar Cruft in deinen lokalen Kopien von entfernten Filialen hast;) Mach lokale Filialen und du kannst git add .ungestraft!
Tim Fulmer
@ Nakilon, deshalb konfigurierst du .gitignorerichtig. Trotzdem gut zu vermeiden git add .. Besser ist git add -u.
Wildcard