Tengo el comando de búsqueda que muestra archivos en mi proyecto:
find . -type f -not -path './node_modules*' -a -not -path '*.git*' \
-a -not -path './coverage*' -a -not -path './bower_components*' \
-a -not -name '*~'
¿Cómo puedo filtrar los archivos para que no muestre los que están en .gitignore?
Pensé que uso:
while read file; do
grep $file .gitignore > /dev/null && echo $file;
done
pero el archivo .gitignore puede tener patrones globales (tampoco funcionará con rutas si el archivo está en .gitignore). ¿Cómo puedo filtrar archivos según patrones que puedan tener globos?
Respuesta1
git
proporcionagit-check-ignore
para comprobar si un archivo está excluido por .gitignore
.
Entonces podrías usar:
find . -type f -not -path './node_modules*' \
-a -not -path '*.git*' \
-a -not -path './coverage*' \
-a -not -path './bower_components*' \
-a -not -name '*~' \
-exec sh -c '
for f do
git check-ignore -q "$f" ||
printf '%s\n' "$f"
done
' find-sh {} +
Tenga en cuenta que pagaría un gran coste por esto porque la verificación se realizó para cada archivo.
Respuesta2
Para mostrar los archivos que están en su proceso de pago y que son rastreados por Git, use
$ git ls-files
Este comando tiene varias opciones para mostrar, por ejemplo, archivos en caché, archivos sin seguimiento, archivos modificados, archivos ignorados, etc. Consulte git ls-files --help
.
Respuesta3
hay un comando git para hacer exactamente esto: por ejemplo
my_git_repo % git grep --line-number TODO
desktop/includes/controllers/user_applications.sh:126: # TODO try running this without sudo
desktop/includes/controllers/web_tools.sh:52: TODO: detail the actual steps here:
desktop/includes/controllers/web_tools.sh:57: TODO: check if, at this point, the menurc file exists. i.e. it was created
Como dijiste, hará un grep básico con la mayoría de las opciones de grep normales, pero no buscará .git
ninguno de los archivos o carpetas de tu .gitignore
archivo.
Para más detalles, verman git-grep
Submódulos:
Si tiene otros repositorios de git dentro de este repositorio de git (deben estar en submódulos), --recurse-submodules
también puede usar la bandera para buscar en los submódulos.
Respuesta4
Puede utilizar una matriz en la que se realizará bash glob.
Tener archivos como este:
touch file1 file2 file3 some more file here
Y tener un ignore
archivo como este
cat <<EOF >ignore
file*
here
EOF
Usando
arr=($(cat ignore));declare -p arr
Resultará en esto:
declare -a arr='([0]="file" [1]="file1" [2]="file2" [3]="file3" [4]="here")'
Luego puede utilizar cualquier técnica para manipular esos datos.
Personalmente prefiero algo como esto:
awk 'NR==FNR{a[$1];next}(!($1 in a))' <(printf '%s\n' "${arr[@]}") <(find . -type f -printf %f\\n)
#Output
some
more
ignore