Encuentra archivos que no están en .gitignore

Encuentra archivos que no están en .gitignore

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

gitproporcionagit-check-ignorepara 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á .gitninguno de los archivos o carpetas de tu .gitignorearchivo.
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-submodulestambié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 ignorearchivo 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

información relacionada