Wie kann ich “git status” ausführen und nur die Dateinamen im Gegensatz zum langen relativen Pfad abrufen?
Wie man “git status” ausführt und nur die Dateinamen erhält
Mahdi Yusuf
Markus Longair
Die Ausgabe von git status --porcelain
das so konzipiert ist, dass es in einem Skript einfach zu analysieren ist, gibt die vollständigen Pfade anstelle der relativen Pfade aus, unabhängig davon, wo sich Ihr aktuelles Verzeichnis innerhalb des Baums befindet.
Jede Zeile ausgegeben von git status --porcelain
hat zwei führende Zeichen, die den Status der Datei angeben (z. B. ob sie nicht verfolgt, geändert, neu, gelöscht usw. ist), gefolgt von einem Leerzeichen. Wenn Sie also nur die vollständigen Pfade von allem möchten, was in der Ausgabe von erwähnt würde git status
du kannst tun:
git status --porcelain | sed s/^...//
-
Das gleiche wie git status -s, aber ohne Färbung.
– Ohrlängsschienen
6. Februar 2013 um 18:51 Uhr
-
Ich habe festgestellt, dass ich nach einer etwas anderen Frage gesucht habe, aber diese enthält immer noch die Statusmarkierung (von der ich nicht glaube, dass es eine Option zum Entfernen gibt). Die Antwort von @sehe ist besser, wenn Sie nur den Dateinamen und sonst nichts wollen.
– Isaac Aggrey
7. August 2013 um 22:05 Uhr
-
@IsaacAggrey: außer dass Sie mit der Antwort von sehe mehrere Befehle ausführen müssen, und selbst diese Befehle werden nicht nachverfolgte Dateien übersehen, die in der Ausgabe von git status erscheinen würden, daher ist dies keine genaue Antwort auf die Frage. Es ist einfach, die Statuszeichen am Anfang der von mir vorgeschlagenen Ausgabe zu entfernen – ich habe meine Antwort bearbeitet, um zu zeigen, wie.
– Mark Longair
23. August 2013 um 8:59 Uhr
-
@earlonrails Es ist nur dasselbe, wenn Sie sich im Stammverzeichnis befinden, führen Sie dieselben Befehle aus einem Unterverzeichnis des Repos aus und Sie werden sehen, dass einer relative Pfade zum Arbeitsverzeichnis verwendet, der andere vollständige Pfade im Stammverzeichnis des Repos
– jxramos
28. März 2018 um 23:55 Uhr
-
@jxramos Sie können cut immer noch verwenden, ändern Sie einfach das Flag für den Befehl git status,
git status --porcelain | cut -c4-
. Meiner Meinung nachcut
ist besser als benutzensed
weil mehr Systeme haben werdencut
bereits installiert.– Ohrlängsschienen
2. April 2018 um 18:41 Uhr
earlonrails
Ich finde cut
ist gut dafür.
git status -s | cut -c4-
-
und hier habe ich sed verwendet, um die Statuscodes zu entfernen. Ich habe das Flag -c noch nie zum Schneiden verwendet. Hübsch! fügen Sie dies zu Ihrer .gitconfig für einen guten Tagesstart hinzu:
de=!$EDITOR $( git status --porcelain | cut -c4- ) & # open all changed files in EDITOR
– Johannes Hart
2. August 2013 um 22:09 Uhr
-
Für jemanden, der sich nicht auskennt
cut
Befehl,cut -c 4-
bedeutet, Zeichen vom vierten Zeichen nehmen.– Sanghyun Lee
20. Februar 2014 um 7:15 Uhr
-
Ja, sauberer als in diesem Fall.
– Simon Pickup
12. April 2019 um 7:48 Uhr
sehen
Aha, ich denken Ich habe gerade habe die Frage verstanden: Sie wollen Basisnamen? Anheften | while read a; do basename "$a"; done
zu einem der folgenden:
wie wäre es mit
-
git diff --name-only
für Änderungen relativ zum Index
-
git diff --name-only --staged
für … gut inszenierte Chages 🙂
-
git diff --name-only HEAD
habe beides
-
Ich verstehe, wenn du nur willst Basisnamen heften Sie dies an das Ende von: ` | while read fname; do basename “$fname”; fertig`
– sehen
16. März 2011 um 14:27 Uhr
-
Erzeugt keine Pfadnamen relativ zum aktuellen Verzeichnis wie git status | Antwort schneiden
– AnthumChris
14. März 2019 um 21:13 Uhr
-
Auch wenn es sicherlich nur relativ zum Stamm des Git-Repositorys ausgibt, ist dies eine viel treffendere Lösung als
git status --porcelain
da Sie die Ausgabe nicht verarbeiten/bereinigen müssen.– Miguel Ruiz
3. November 2021 um 17:34 Uhr
-
Funktioniert einfach super:
vi `git dno`
Ich glaube, die dno-Verknüpfung für git diff kam standardmäßig in meine gitconfig.– k00ka
9. Februar 2022 um 17:43 Uhr
Eine viel einfachere Lösung, die in integriert ist git
verwenden ls-files
.
Aus den Dokumenten:
OPTIONEN
-c –cached Zwischengespeicherte Dateien in der Ausgabe anzeigen (Standard)
-d –deleted Gelöschte Dateien in der Ausgabe anzeigen
-m –modified Zeigt geänderte Dateien in der Ausgabe an
-o –others Andere (dh nicht getrackte) Dateien in der Ausgabe anzeigen
-i –ignored Nur ignorierte Dateien in der Ausgabe anzeigen. Wenn Sie Dateien im Index anzeigen, drucken Sie nur diejenigen, die mit einem Ausschlussmuster übereinstimmen. Wenn Sie „andere“ Dateien anzeigen, zeigen Sie nur diejenigen an, die mit einem Ausschlussmuster übereinstimmen. Standard-Ignore-Regeln werden nicht automatisch aktiviert, daher ist mindestens eine der –exclude*-Optionen erforderlich.
-s –stage Zeigt die Modusbits, den Objektnamen und die Stufennummer des gestuften Inhalts in der Ausgabe an.
-u –unmerged Nicht zusammengeführte Dateien in der Ausgabe anzeigen (erzwingt –stage)
Beispiel, das Flaggen zeigt, kann auch kombiniert werden:
git ls-files -dmo
Dan McClain
git status
wird immer nach unten gehen (bearbeiten und höher) den Baum und zeigen relative Pfade an. Wenn Sie die Datei nur in dem Verzeichnis haben möchten, in dem Sie sich befinden, lesen Sie diese verwandte Antwort
Sie-Liang Shih
Rufen Sie den Namen geänderter Dateien ab
git status --porcelain|awk '{if($1=="M") {print "basename " $2}}'|sh
Ich verwende ein ähnliches Skript, um meine geänderten Dateien wie folgt auf einen Remote-Server zu kopieren:
git status --porcelain|awk '{if($1=="M") {print "scp " $2 " account_name@server_ip:~/my_codebase/$(dirname " $2 ")/;"} }'|sh
Stassa Patsantzis
git status gibt relative Pfade aus, wenn Sie also in dasselbe Verzeichnis wie die Datei (unter dem Stammverzeichnis Ihres Arbeitsverzeichnisses) wechseln, bevor Sie git status ausführen, werden nur die Basisnamen von hinzugefügten/bereitgestellten Dateien ausgegeben.
cd /long/path/to/my/repo/root/dir
"stuff" > ./newfile.txt
> git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: /long/path/to/my/repo/root/dir/plus/some/more/levels/of/directory/structure/inside/it/changed_file.txt
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
# long/path/to/my/repo/root/dir/plus/some/even/more/levels/of/directory/structure/inside/it/but_another_new_file.txt
# newfile.txt
no changes added to commit (use "git add" and/or "git commit -a")
dh „newfile.txt“ wird ohne den vollständigen Pfad aufgeführt, da Sie sich im selben Pfad befinden.