Gibt es eine Möglichkeit, tree
die Anzeige von Dateien zu unterbinden, die in ignoriert werden .gitignore
?
Antwort1
Ein anderer Weg ist möglich, wenn Sie verwendenBaum 1.8.0
da es das --fromfile
Flag unterstützt:
--fromfile
Liest eine Verzeichnisliste aus einer Datei statt aus dem Dateisystem. Die in der Befehlszeile angegebenen Pfade sind Dateien, aus denen gelesen werden soll, und keine Verzeichnisse, in denen gesucht werden soll. Der Punkt (
.
)-Verzeichnis gibt an, dass der Baum Pfade von der Standardeingabe lesen soll.
Wir könnten verwenden, git ls-tree
um alle nicht von Git ignorierten Dateien in einem Projekt abzurufen und die Ausgabe an weiterzuleiten tree
.
Angenommen, wir haben ein Git-Repository, in dem ignored
Dateien in Folgendem ignoriert werden .gitignore
:
git_repo
├── .gitignore
├── bar
│ ├── b.txt
│ └── ignored
├── foo
│ ├── a.txt
│ └── ignored
└── ignored
Der folgende Befehl:
git ls-tree -r --name-only HEAD | tree --fromfile
Gibt:
.
├── .gitignore
├── bar
│ └── b.txt
└── foo
└── a.txt
2 directories, 3 files
Oder wenn Sie einen bestimmten Pfad benötigen:
git ls-tree -r --name-only HEAD foo | tree --fromfile
Gibt:
.
└── a.txt
0 directories, 1 file
Vorbehalte
- In acht nehmendass Änderungen wie das Löschen oder Umbenennen von Dateien, die noch nicht festgeschrieben wurden, dazu führen können,
git ls-tree
dass die Datei nicht mehr synchron erscheint.
Antwort2
Rippengreprespektiert .gitignore
(und einige andere 'ignorieren'-Dateien) standardmäßig und kann als Alternative zu Git-Befehlen verwendet werden. Der Unterschied besteht darin, dass alle Dateien (außer versteckten Dateien) aufgelistet werden, auch wenn sie noch nicht in die Versionskontrolle übernommen wurden:
rg --files | tree --fromfile
Damit lässt sich eine Shell-Funktion erstellen, die zuerst Verzeichnisse sortiert und eine flexiblere Nutzung ermöglicht (Angabe des Verzeichnispfads und Hinzufügen von Ripgrep-Flags):
rg,tree() { rg --files $@|tree --fromfile --dirsfirst }
Erfordert Baum > 1,8, wie in einer anderen Antwort erläutert.
Antwort3
Ein Baum stützt die -I
Flagge.
-I pattern
Listen Sie nicht die Dateien auf, die dem Platzhaltermuster entsprechen.
Tree unterstützt ein einzelnes Muster, das alle entsprechenden Dateien/Verzeichnisse ausschließt.
Die Ignorierdateien von Git sind etwas komplizierter:
Der Ausschluss kann von mehreren Dateien, $HOME/.config/git/ignore
, der Ausgabe von git config --get core.excludesfile
, .gitignore
(pro Verzeichnis), ~/.gitignore
, und mehr erfolgen (siehe man gitignore
).
Ein weiteres Problem besteht darin, dass die tree
unterstützten Muster sich von denen unterscheiden, die Git verwendet (wie von @Brad Urani angemerkt).
Aber wir können uns einigermaßen nahe kommen ...
tree -I "$(grep -hvE '^$|^#' {~/,,$(git rev-parse --show-toplevel)/}.gitignore|sed 's:/$::'|tr \\n '\|')"
Oder als Funktion:
function gtree {
git_ignore_files=("$(git config --get core.excludesfile)" .gitignore ~/.gitignore)
ignore_pattern="$(grep -hvE '^$|^#' "${git_ignore_files[@]}" 2>/dev/null|sed 's:/$::'|tr '\n' '\|')"
if git status &> /dev/null && [[ -n "${ignore_pattern}" ]]; then
tree -I "${ignore_pattern}" "${@}"
else
tree "${@}"
fi
}
Antwort4
Tree verfügt --gitignore
ab Version 2.0.0 (Veröffentlichung Dezember 2021) über eine Option.
https://gitlab.com/OldManProgrammer/unix-tree/-/blob/master/ÄNDERUNGEN