¿Hay alguna manera de hacer que tree
no se muestren los archivos que se ignoran .gitignore
?
Respuesta1
Otra forma es posible si estás usandoárbol 1.8.0
ya que soporta la --fromfile
bandera:
--fromfile
Lee una lista de directorios de un archivo en lugar del sistema de archivos. Las rutas proporcionadas en la línea de comando son archivos para leer en lugar de directorios para buscar. El punto (
.
) directorio indica que el árbol debe leer las rutas de la entrada estándar.
Podríamos usarlo git ls-tree
para obtener todos los archivos que no sean ignorados por Git en un proyecto y canalizar la salida a tree
.
Suponiendo que tenemos un repositorio git, donde ignored
los archivos se ignoran en .gitignore
:
git_repo
├── .gitignore
├── bar
│ ├── b.txt
│ └── ignored
├── foo
│ ├── a.txt
│ └── ignored
└── ignored
El siguiente comando:
git ls-tree -r --name-only HEAD | tree --fromfile
Da:
.
├── .gitignore
├── bar
│ └── b.txt
└── foo
└── a.txt
2 directories, 3 files
O si necesita una ruta específica:
git ls-tree -r --name-only HEAD foo | tree --fromfile
Da:
.
└── a.txt
0 directories, 1 file
Advertencias
- Tener cuidadoque cambios como archivos eliminados o renombrados que aún no se han confirmado pueden hacer que
git ls-tree
parezcan desincronizados.
Respuesta2
Ripgreprespeta .gitignore
(y algunos otros archivos 'ignorar') de forma predeterminada y puede usarse como una alternativa a los comandos de git. La diferencia es que todos los archivos (excepto los archivos ocultos) se enumeran incluso si aún no se han comprometido al control de versiones:
rg --files | tree --fromfile
Esto se puede usar para crear una función de shell que ordene los directorios primero y permita un uso más flexible (especificando la ruta del directorio y agregando indicadores ripgrep):
rg,tree() { rg --files $@|tree --fromfile --dirsfirst }
Requiere árbol> 1,8 como se señala en otra respuesta.
Respuesta3
El árbol sostiene la -I
bandera.
-I pattern
No incluya aquellos archivos que coincidan con el patrón comodín.
Tree admite un patrón único que excluirá todos los archivos/directorios que coincidan con él.
Los archivos ignorados de Git son un poco más complicados:
La exclusión puede provenir de varios archivos, $HOME/.config/git/ignore
la salida de git config --get core.excludesfile
( .gitignore
por directorio), ~/.gitignore
y más (consulte man gitignore
).
Otro problema es que los patrones que tree
admite difieren de lo que hace git (como lo señaló @Brad Urani).
Pero podemos acercarnos...
tree -I "$(grep -hvE '^$|^#' {~/,,$(git rev-parse --show-toplevel)/}.gitignore|sed 's:/$::'|tr \\n '\|')"
O como función:
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
}
Respuesta4
El árbol tiene una --gitignore
opción a partir de la versión 2.0.0, lanzada en diciembre de 2021.
https://gitlab.com/OldManProgrammer/unix-tree/-/blob/master/CHANGES