Gibt es eine Möglichkeit, festzustellen, ob eine Datei verfolgt wird, indem Sie einen git
Befehl ausführen und den Beendigungscode überprüfen?
Mit anderen Worten: Verfolgt Git eine Datei?
Gibt es eine Möglichkeit, festzustellen, ob eine Datei verfolgt wird, indem Sie einen git
Befehl ausführen und den Beendigungscode überprüfen?
Mit anderen Worten: Verfolgt Git eine Datei?
Antworten:
Versuchen:
git ls-files --error-unmatch <file name>
wird mit 1 beendet, wenn die Datei nicht verfolgt wird
--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
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
}
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ö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.sh
wird verfolgt und geändert und newbla
wird 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")
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 zeigt
git 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 wird
PS$> git status foo.txt
error: pathspec 'foo.txt' did not match any file(s) known to git.
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,
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.
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 ~/.gitconfig
und 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
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,
root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
commit ad9180b772d5c64dcd79a6cbb9487bd2ef08cbfc
Author: User <someone@somedomain.com>
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#
Nur meine zwei Cent:
git ls-files | grep -x relative/path
Wo relative/path
kann leicht durch Drücken tab
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.
grep
Option hinzufügen --fixed-strings
.