2010-03-08 8 views
249

¿Hay alguna forma de saber si un archivo está siendo rastreado ejecutando algún comando git y comprobando su código de salida?¿Cómo saber si se hace un seguimiento de un archivo git (mediante el código de salida del shell)?

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

+0

Creo que el punto es, ¿cuál es el criterio para decidir si un archivo se rastrea o no? Debería haber algún tipo de colección de archivos rastreados para buscar. – smwikipedia

Respuesta

311

intento:

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

terminará con 1 si el archivo no se realiza un seguimiento

+0

Al menos con mi mayor (1.6.0) versión de git, debe colocar la opción '--error-unmatch' ** antes de ** el nombre de archivo para obtener un error. De alguna manera, la opción solo se aplica a los nombres de archivo que lo siguen. –

+0

En realidad, el problema parece ser que la opción de GNU getopt permuting no está habilitada, y cuando aparece después de un nombre de archivo (o después de '--') el' --error-unmatch' se trata como simplemente otro (no en el índice) nombre de archivo, y no tiene ningún efecto. –

+17

'git ls-files | grep '? ejemplo: 'git ls-files | grep Main.h' – gaussblurinc

11

Intente ejecutar git status en el archivo. Se imprimirá un error si no es rastreado por git

PS$> git status foo.txt 
error: pathspec 'foo.txt' did not match any file(s) known to git. 
+0

Wow. Debí haber estado ejecutándolo en un directorio y actuó como si estuviera revisando todo el repositorio. Gracias. –

+4

En realidad, si ejecuto 'git status trackedfile' obtengo 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 la salida de cadena. –

+39

Me parece que no se produce 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 funcionará). – JellicleCat

15

EDITAR

Si es necesario utilizar git de fiesta no es --porcelain opción de git status:

--porcelain

Give the output in a stable, easy-to-parse format for scripts. Currently this is identical to --short output, but is guaranteed not to change in the future, making it safe for scripts.

salida parece esto:

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

O si lo hace sólo un archivo a la vez:

> git status --porcelain bla 
?? bla 

ORIGINAL

hacer:

git status 

Verá informe que indica qué archivos se actualizan y cuáles están sin seguimiento.

Se puede ver bla.sh se realiza un seguimiento y modificar y newbla no se realiza un seguimiento:

# 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") 
+0

Lo siento, debería haber sido más claro. El estado es correcto, pero prefiero verificar un código de salida que analizar. –

+0

'git status --porcelain' es tu amigo si necesitas analizar el resultado por script, echa un vistazo al documento vinculado que muestra algunas otras opciones útiles – stefanB

+0

Hihi, no funciona con Git muy antiguo:' git status --porcelain error: la opción desconocida 'porcelana 'Versión es 1.6.0 :-) –

6

no sé de cualquier comando git que da una "mala" código de salida, pero parece que una manera fácil hacerlo sería usar un comando git que no da salida a un archivo que no está rastreado, como git-log o git-ls-files. De esta forma, en realidad no tiene que hacer ningún análisis sintáctico, 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 .

va a salir con un código de cero si el archivo se realiza un seguimiento, sino un código de salida de uno si el archivo no se realiza un seguimiento.

31

Si no desea que el desorden de su consola con mensajes de error, también puede ejecutar

git ls-files file_name 

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

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

$gitResult = (git ls-files $_) | out-string 
if ($gitResult.length -ne 0) 
{ 
    ## do stuff with the tracked file 
} 
1

Sólo mis dos centavos:

git ls-files | grep -x relative/path

donde relative/path se puede determinar fácilmente por presionando tab dentro de un shell de autocompletado. Agregue un | wc -l adicional para obtener una salida de 1 o 0.

0

usando git log 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 se realiza un seguimiento git,

[email protected]:~/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 se GIT seguimiento,

[email protected]:~/project-repo-directory# git log src/../somefile.js 
[email protected]:~/project-repo-directory# 
3

que sugieren una costumbre alias en que .gitconfig.

Tienes que manera de hacerlo:

1) Con el comando git:

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

2) Edición ~/.gitconfig y añadir 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 puesto en marcha comando (1) o 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 
Cuestiones relacionadas