Wie kann man feststellen, ob eine Datei git-verfolgt wird (anhand des Shell-Exit-Codes)?

357

Gibt es eine Möglichkeit, festzustellen, ob eine Datei verfolgt wird, indem Sie einen gitBefehl ausführen und den Beendigungscode überprüfen?

Mit anderen Worten: Verfolgt Git eine Datei?

Dale Forester
quelle
Ich denke, der Punkt ist, was sind die Kriterien, um eine Datei als verfolgt oder nicht verfolgt zu entscheiden. Es sollte eine Art nachverfolgter Dateisammlung zum Suchen geben.
Smwikipedia

Antworten:

443

Versuchen:

git ls-files --error-unmatch <file name>

wird mit 1 beendet, wenn die Datei nicht verfolgt wird

hasen
quelle
Zumindest bei meiner älteren (1.6.0) Version von git müssen Sie die --error-unmatchOption vor den Dateinamen setzen, um einen Fehler zu erhalten. Irgendwie wird die Option nur auf nachfolgende Dateinamen angewendet.
Alex Dupuy
Tatsächlich scheint das Problem zu sein, dass das Permutieren der GNU-Option getopt nicht aktiviert ist. Wenn es nach einem Dateinamen (oder danach --) angezeigt --error-unmatchwird, wird es als nur ein anderer Dateiname (nicht im Index) behandelt und hat keine Auswirkung.
Alex Dupuy
29
git ls-files | grep <PATTERN>? Beispiel:git ls-files | grep Main.h
Gaussblurinc
1
[Ein naiver Weg] Nehmen Sie eine kleine Änderung in der Datei vor (Hinzufügen / Entfernen eines Leerzeichens). Und sehen Sie, ob die Datei aufgelistet wird, wenn 'git status' eingegeben wird. Ein dummer Weg, kann aber Zeit sparen.
BraveNinja
Aber ich habe es mit dem Befehl "git add -A && git commit -m" blah "hinzugefügt und festgeschrieben. Sogar ganze Dateien mit dem Befehl" git ls-tree --name-only -r sha1 "sehen.
Dr.jacky
66

Wenn Sie Ihre Konsole nicht mit Fehlermeldungen überladen möchten, können Sie sie auch ausführen

git ls-files file_name

und überprüfen Sie dann das Ergebnis. Wenn git nichts zurückgibt, wird die Datei nicht verfolgt. Wenn es verfolgt wird, gibt git den Dateipfad zurück.

Dies ist praktisch, wenn Sie es in einem Skript kombinieren möchten, z. B. PowerShell:

$gitResult = (git ls-files $_) | out-string
if ($gitResult.length -ne 0)
{
    ## do stuff with the tracked file
}
Käse
quelle
Ich denke file_name, muss eine genaue Übereinstimmung sein (vollständiger Pfad + Dateiname), kann aber mit Platzhaltern verwendet werden:git ls-files *foo.rb
Dechimp
16

BEARBEITEN

Wenn Sie git from bash verwenden müssen, haben Sie folgende --porcelainMöglichkeiten git status:

--Porzellan

Geben Sie die Ausgabe in einem stabilen, einfach zu analysierenden Format für Skripte an. Derzeit ist dies identisch mit der Ausgabe von --short, wird sich jedoch in Zukunft garantiert nicht ändern, sodass es für Skripte sicher ist.

Die Ausgabe sieht folgendermaßen aus:

> git status --porcelain
 M starthudson.sh
?? bla

Oder wenn Sie jeweils nur eine Datei erstellen:

> git status --porcelain bla
?? bla

ORIGINAL

tun:

git status

Sie sehen einen Bericht, in dem angegeben ist, welche Dateien aktualisiert wurden und welche nicht verfolgt werden.

Sie können sehen, bla.shwird verfolgt und geändert und newblawird nicht verfolgt:

# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#
#       modified:   bla.sh
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       newbla
no changes added to commit (use "git add" and/or "git commit -a")
stefanB
quelle
Entschuldigung, ich hätte klarer sein sollen. Der Status ist in Ordnung, aber ich möchte lieber einen Exit-Code überprüfen als die Ausgabe analysieren.
Dale Forester
git status --porcelainist dein Freund, wenn du die Ausgabe per Skript analysieren musst, schau dir das verknüpfte Dokument an, das einige andere nützliche Optionen zeigt
stefanB
Hihi, funktioniert nicht mit sehr alten Git: git status --porcelain error: unknown option Porzellan 'Version ist 1.6.0 :-)
Laryx Decidua
@ user465139 das ist richtig ... du brauchst git 1.7.0 oder neuer (die porzellanoption wurde bis dahin nicht hinzugefügt).
Mason81
13

Versuchen Sie, git statusdie Datei auszuführen. Es wird ein Fehler ausgegeben, wenn er nicht von git verfolgt wird

PS$> git status foo.txt
error: pathspec 'foo.txt' did not match any file(s) known to git.
JaredPar
quelle
Beeindruckend. Ich muss es in einem Verzeichnis ausgeführt haben und es hat sich so verhalten, als würde es das gesamte Repo überprüfen. Vielen Dank.
Dale Forester
4
Wenn ich laufe, git status trackedfileerhalte ich den Exit-Code 1 (erwartet, dass 0 nützlich ist), aber es gibt mir keinen "Fehler:" in der Ausgabe. Ich würde lieber einen Exit-Code analysieren als eine String-Ausgabe.
Dale Forester
43
Ich stelle fest, dass kein Fehler ausgelöst wird, wenn ich den Git-Status für eine Datei ausführe, die in meiner Git-Arbeitskopie vorhanden ist, aber von .gitignore ausgeschlossen wird. (Dh diese Antwort reicht nicht.)
JellicleCat
Bitte beachten Sie, dass es nicht gut funktioniert, wenn die Datei in der Ignorierliste ist, dh in der Datei.gitignore
Robin Hsu
8
Das geht nicht Es wird immer dasselbe gedruckt, auch wenn die Datei nicht vorhanden ist. $ git status notthere:On branch master nothing to commit, working directory clean
Chloe
6

Ich kenne keinen git-Befehl, der einen "schlechten" Exit-Code liefert, aber es scheint eine einfache Möglichkeit zu sein, einen git-Befehl zu verwenden, der keine Ausgabe für eine Datei liefert, die nicht verfolgt wird, wie z Git-Log oder Git-LS-Dateien. Auf diese Weise müssen Sie keine Analyse durchführen. Sie können es über ein anderes einfaches Dienstprogramm wie grep ausführen, um festzustellen, ob eine Ausgabe vorhanden war.

Zum Beispiel,

git-ls-files test_file.c | grep.

wird mit einem Nullcode beendet, wenn die Datei verfolgt wird, aber mit einem Beendigungscode von eins, wenn die Datei nicht verfolgt wird.

Jay Walker
quelle
3

Ich schlage einen benutzerdefinierten Alias für Sie vor .gitconfig.

Sie müssen viel tun:

1) Mit dem Befehl git:

git config --global alias.check-file <command>

2) Bearbeiten ~/.gitconfigund Hinzufügen dieser Zeile im Alias-Bereich:

[alias]
    check-file = "!f() { if [ $# -eq 0 ]; then echo 'Filename missing!'; else tracked=$(git ls-files ${1}); if [[ -z ${tracked} ]]; then echo 'File not tracked'; else echo 'File tracked'; fi; fi;  };  f"

Nach dem Start des Befehls (1) oder der gespeicherten Datei (2) können Sie ihn in Ihrem Arbeitsbereich testen:

$ git check-file
$ Filename missing 

$ git check-file README.md
$ File tracked 

$ git check-file foo
$ File not tracked
Luca Davanzo
quelle
2

using git loggibt Informationen dazu. Wenn die Datei in git verfolgt wird, zeigt der Befehl einige Ergebnisse (Protokolle) an. Sonst ist es leer.

Zum Beispiel, wenn die Datei git verfolgt wird,

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
commit ad9180b772d5c64dcd79a6cbb9487bd2ef08cbfc
Author: User <[email protected]>
Date:   Mon Feb 20 07:45:04 2017 -0600

    fix eslint indentation errors
....
....

Wenn die Datei nicht git verfolgt wird,

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
root@user-ubuntu:~/project-repo-directory#
SuperNova
quelle
1

Nur meine zwei Cent:

git ls-files | grep -x relative/path

Wo relative/pathkann leicht durch Drücken tabinnerhalb einer Auto-Vervollständigungs-Shell bestimmt werden. Fügen Sie eine zusätzliche hinzu | wc -l , um eine 1 oder 0 Ausgabe zu erhalten.

andreee
quelle
Abhängig vom Pfad (z. B. wenn er einen Punkt enthält) sollten Sie eine grepOption hinzufügen --fixed-strings.
EndlosSchleife