¿Cómo saber si un archivo es rastreado por git (por código de salida de shell)?

357

¿Hay alguna manera de saber si se está rastreando un archivo ejecutando algunos git comando y verificando su código de salida?

En otras palabras: ¿git está rastreando un archivo?

Dale Forester
fuente
Creo que el punto es cuál es el criterio para decidir un archivo como rastreado o no. Debe haber algún tipo de colección de archivos rastreados para buscar.
smwikipedia

Respuestas:

443

tratar:

git ls-files --error-unmatch <file name>

saldrá con 1 si el archivo no se rastrea

Hasen
fuente
Al menos con mi versión anterior (1.6.0) de git, debe poner la --error-unmatchopción antes del nombre del archivo para obtener un error. De alguna manera, la opción solo se aplica a los nombres de archivo que la siguen.
Alex Dupuy
En realidad, el problema parece ser que la permutación de la opción getopt de GNU no está habilitada, y cuando aparece después de un nombre de archivo (o después --), --error-unmatchse trata como otro nombre de archivo (no en el índice) y no tiene ningún efecto.
Alex Dupuy
29
git ls-files | grep <PATTERN>? ejemplo:git ls-files | grep Main.h
gaussblurinc
1
[Una manera ingenua] Haga un pequeño cambio en el archivo (agregue / elimine un espacio). Y vea si el archivo aparece en la lista cuando se escribe 'git status'. Una manera tonta, pero puede ahorrar tiempo.
BraveNinja
Pero lo agregué y lo comprometí con el comando "git add -A && git commit -m" blah ". Incluso veo archivos completos con el comando" git ls-tree --name-only -r sha1 ".
Dr.jacky
66

Si no desea abarrotar su consola con mensajes de error, también puede ejecutar

git ls-files file_name

y luego verifica el resultado. Si git no devuelve nada, entonces el archivo no se rastrea. Si se rastrea, git devolverá la ruta del archivo.

Esto es útil si desea combinarlo en un script, por ejemplo PowerShell:

$gitResult = (git ls-files $_) | out-string
if ($gitResult.length -ne 0)
{
    ## do stuff with the tracked file
}
cheesus
fuente
Creo que file_namedebe ser una coincidencia exacta (ruta completa + nombre de archivo), pero se puede usar con comodines:git ls-files *foo.rb
dechimp
16

EDITAR

Si necesita usar git desde bash, hay una --porcelainopción para git status:

--porcelana

Proporcione la salida en un formato estable y fácil de analizar para los scripts. Actualmente, esto es idéntico a la salida --short, pero se garantiza que no cambiará en el futuro, por lo que es seguro para los scripts.

La salida se ve así:

> git status --porcelain
 M starthudson.sh
?? bla

O si solo hace un archivo a la vez:

> git status --porcelain bla
?? bla

ORIGINAL

hacer:

git status

Verá un informe que indica qué archivos se actualizaron y cuáles no.

Puede ver que bla.shse rastrea y modifica y newblano se rastrea:

# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#
#       modified:   bla.sh
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       newbla
no changes added to commit (use "git add" and/or "git commit -a")
stefanB
fuente
Lo siento, debería haber sido más claro. El estado está bien, pero prefiero verificar un código de salida que analizar la salida.
Dale Forester
git status --porcelaines su amigo si necesita analizar la salida por script, eche un vistazo al documento vinculado que muestra otras opciones útiles
stefanB
Hihi, no funciona con Git muy antiguo: git status --porcelain error: unknown option la versión de porcelana es 1.6.0 :-)
Laryx Decidua
@ user465139 eso es correcto ... necesita git 1.7.0 o más reciente (la opción de porcelana no se agregó hasta entonces).
mason81
13

Intenta ejecutar git statusel archivo. Imprimirá un error si git no lo rastrea

PS$> git status foo.txt
error: pathspec 'foo.txt' did not match any file(s) known to git.
JaredPar
fuente
Guau. Debo haber estado ejecutándolo en un directorio y actuó como si estuviera revisando todo el repositorio. Gracias.
Dale Forester
44
En realidad, si ejecuto git status trackedfileme sale el código de salida 1 (se espera que 0 sea útil) pero no me da "error:" en la salida. Prefiero analizar un código de salida que una salida de cadena.
Dale Forester
43
Me parece que no se genera ningún error si ejecuto el estado de git en un archivo que existe en mi copia de trabajo de git pero que está excluido por .gitignore. (Es decir, esta respuesta no servirá).
JellicleCat
Tenga en cuenta que no funciona bien si el archivo está en la lista de ignorados, es decir, en el archivo.gitignore
Robin Hsu
8
Eso no funciona Siempre imprime lo mismo, incluso si el archivo no existe. $ git status notthere:On branch master nothing to commit, working directory clean
Chloe
6

No conozco ningún comando git que proporcione un código de salida "malo", pero parece que una forma fácil de hacerlo sería utilizar un comando git que no proporcione resultados para un archivo que no se rastrea, como archivos git-log o git-ls-files. De esa manera, no tiene que analizar realmente nada, puede ejecutarlo a través de otra utilidad simple como grep para ver si hubo algún resultado.

Por ejemplo,

git-ls-files test_file.c | grep.

saldrá con un código cero si se rastrea el archivo, pero un código de salida de uno si no se rastrea el archivo.

Peatón imprudente
fuente
3

Sugiero un alias personalizado en ti .gitconfig.

Tienes que hacerlo:

1) Con el comando git:

git config --global alias.check-file <command>

2) Edición ~/.gitconfigy agregue esta línea en la sección de alias:

[alias]
    check-file = "!f() { if [ $# -eq 0 ]; then echo 'Filename missing!'; else tracked=$(git ls-files ${1}); if [[ -z ${tracked} ]]; then echo 'File not tracked'; else echo 'File tracked'; fi; fi;  };  f"

Una vez ejecutado el comando (1) o el archivo guardado (2), en su espacio de trabajo puede probarlo:

$ git check-file
$ Filename missing 

$ git check-file README.md
$ File tracked 

$ git check-file foo
$ File not tracked
Luca Davanzo
fuente
2

utilizando git logle dará información sobre esto. Si el archivo se rastrea en git, el comando muestra algunos resultados (registros). De lo contrario, está vacío.

Por ejemplo, si el archivo tiene un seguimiento de git,

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
commit ad9180b772d5c64dcd79a6cbb9487bd2ef08cbfc
Author: User <[email protected]>
Date:   Mon Feb 20 07:45:04 2017 -0600

    fix eslint indentation errors
....
....

Si el archivo no tiene seguimiento de git,

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
root@user-ubuntu:~/project-repo-directory#
SuperNova
fuente
1

Solo mis dos centavos:

git ls-files | grep -x relative/path

donde relative/pathse puede determinar fácilmente presionando tabdentro de un shell de autocompletado. Agregue un adicional | wc -l para obtener una salida de 1 o 0.

andreee
fuente
Dependiendo de la ruta (por ejemplo, si contiene un punto), debe agregar la grepopción --fixed-strings.
EndlosSchleife