webentwicklung-frage-antwort-db.com.de

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

Gibt es eine Möglichkeit, einen Befehl wie git ls-files um nur nicht verfolgte Dateien anzuzeigen?

Der Grund, den ich frage, ist, weil 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 das -o Option zu 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, dass es einen besseren Befehl geben muss, den ich hier verwenden kann. Und wenn nicht, wie erstelle ich benutzerdefinierte Git-Befehle?

311
jnylen

Um nicht verfolgte Dateien aufzulisten, versuchen Sie:

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

Wenn Sie die Ausgabe an xargs leiten müssen, sollten Sie Leerzeichen mit git ls-files -z und xargs -0:

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

Netter Alias ​​für das Hinzufügen von nicht verfolgten Dateien:

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

Bearbeiten: Als Referenz: git-ls-files

487
takeshin

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

git clean -df

fügen Sie x hinzu, wenn Sie auch speziell ignorierte Dateien einschließen möchten. Ich benutze git clean -dfx Ein Los den ganzen Tag.

Sie können einen benutzerdefinierten Git erstellen, indem Sie einfach ein Skript mit dem Namen git-whatever Schreiben und es in Ihrem Pfad haben.

68
Dustin

git add -A -n wird machen was du willst. -A fügt alle nicht verfolgten Dateien zum Repo hinzu, -n macht es zu einem dry-run, wobei das Hinzufügen nicht ausgeführt wird, aber die Statusausgabe mit einer Liste aller Dateien versehen ist, die wäre hinzugefügt worden sind.

45
Mike Lococo

Die akzeptierte Antwort stürzt bei Dateinamen mit Leerzeichen ab. Ich bin derzeit 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
27
youurayy

Alles ist sehr einfach

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

git status -u
23
Valentyna

Wenn Sie nach Dateien suchen, die möglicherweise hinzugefügt werden sollen. Die Ausgabe von git show Erledigt das, enthält aber auch viele andere Dinge. Der folgende Befehl ist nützlich, um die gleiche Liste von Dateien abzurufen, jedoch ohne alle anderen Elemente.

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

Dies ist nützlich, wenn Sie in einer Pipeline nach Dateien suchen, die einem bestimmten Muster entsprechen, und diese dann an git add Weiterleiten.

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

Ich weiß, es ist eine alte Frage, 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-Bereinigungsoperation mit -n (Probelauf) verwenden, um anzuzeigen, welche Dateien (einschließlich der .gitignore-Dateien) entfernt werden:

git clean -xdn

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

  • x - Zeigt alle nicht verfolgten Dateien an (auch von Git und anderen ignoriert, wie Build-Ausgabe usw.)
  • d - zeigt nicht verfolgte Verzeichnisse an
  • n - und am meisten wichtig! - dryrun, d. h. nichts löschen, nur den Bereinigungsmechanismus verwenden, um die Ergebnisse anzuzeigen.
4
code_fodder

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

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

Ich denke das wird so das selbe sein wie das Originalplakat:

git add .

0
Tim Fulmer