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
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.
[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
}
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")
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.
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.
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.
Antworten:
Versuchen:
wird mit 1 beendet, wenn die Datei nicht verfolgt wird
quelle
--error-unmatch
Option vor den Dateinamen setzen, um einen Fehler zu erhalten. Irgendwie wird die Option nur auf nachfolgende Dateinamen angewendet.--
) angezeigt--error-unmatch
wird, wird es als nur ein anderer Dateiname (nicht im Index) behandelt und hat keine Auswirkung.git ls-files | grep <PATTERN>
? Beispiel:git ls-files | grep Main.h
Wenn Sie Ihre Konsole nicht mit Fehlermeldungen überladen möchten, können Sie sie auch ausführen
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:
quelle
file_name
, muss eine genaue Übereinstimmung sein (vollständiger Pfad + Dateiname), kann aber mit Platzhaltern verwendet werden:git ls-files *foo.rb
BEARBEITEN
Wenn Sie git from bash verwenden müssen, haben Sie folgende
--porcelain
Möglichkeitengit status
:Die Ausgabe sieht folgendermaßen aus:
Oder wenn Sie jeweils nur eine Datei erstellen:
ORIGINAL
tun:
Sie sehen einen Bericht, in dem angegeben ist, welche Dateien aktualisiert wurden und welche nicht verfolgt werden.
Sie können sehen,
bla.sh
wird verfolgt und geändert undnewbla
wird nicht verfolgt:quelle
git status --porcelain
ist dein Freund, wenn du die Ausgabe per Skript analysieren musst, schau dir das verknüpfte Dokument an, das einige andere nützliche Optionen zeigtgit status --porcelain error: unknown option
Porzellan 'Version ist 1.6.0 :-)Versuchen Sie,
git status
die Datei auszuführen. Es wird ein Fehler ausgegeben, wenn er nicht von git verfolgt wirdquelle
git status trackedfile
erhalte 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..gitignore
$ git status notthere
:On branch master nothing to commit, working directory clean
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,
wird mit einem Nullcode beendet, wenn die Datei verfolgt wird, aber mit einem Beendigungscode von eins, wenn die Datei nicht verfolgt wird.
quelle
Ich schlage einen benutzerdefinierten Alias für Sie vor
.gitconfig
.Sie müssen viel tun:
1) Mit dem Befehl git:
2) Bearbeiten
~/.gitconfig
und Hinzufügen dieser Zeile im Alias-Bereich:Nach dem Start des Befehls (1) oder der gespeicherten Datei (2) können Sie ihn in Ihrem Arbeitsbereich testen:
quelle
using
git log
gibt 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,
Wenn die Datei nicht git verfolgt wird,
quelle
Nur meine zwei Cent:
git ls-files | grep -x relative/path
Wo
relative/path
kann leicht durch Drückentab
innerhalb einer Auto-Vervollständigungs-Shell bestimmt werden. Fügen Sie eine zusätzliche hinzu| wc -l
, um eine 1 oder 0 Ausgabe zu erhalten.quelle
grep
Option hinzufügen--fixed-strings
.