2011-03-08 10 views

Respuesta

44

La salida de git status --porcelain, diseñado para ser fácil de analizar en un script, da salida a las rutas completas en lugar de rutas relativas independientemente del lugar donde el directorio actual está dentro del árbol.

Cada salida de línea por git status --porcelain tiene dos caracteres principales que indican el estado del archivo (por ejemplo, si no está rastreado, modificado, nuevo, eliminado, etc.) seguido de un espacio, por lo que si solo desea las rutas completas de todo lo que se menciona en la salida de git status que puede hacer:

git status --porcelain | sed s/^...// 
+3

Igual que el estado de git -s pero sin colorear. – earlonrails

+1

Encontré que estaba buscando una pregunta ligeramente diferente, pero esto todavía incluye el marcador de estado (que no creo que haya una opción para eliminar). La respuesta de @sehe es mejor si solo quieres el nombre de archivo y nada más. –

+1

@IsaacAggrey: excepto que con la respuesta de sehe tienes que ejecutar múltiples comandos, e incluso esos comandos perderán archivos sin seguimiento que aparecerían en el resultado del estado de git, por lo que no es una respuesta precisa a la pregunta. Es fácil quitar los caracteres de estado del inicio de la salida producida por lo que sugerí: he editado mi respuesta para mostrar cómo. –

3

git status siempre caminará hacia abajo (edite y hacia arriba) en el árbol y mostrará las rutas relativas. Si sólo desea que el archivo en el directorio donde se encuentra, See this related answer

5

Para obtener sólo los nombres de archivo, como usted pidió:

git status --porcelain | sed -e 's!.*/!!' 

no puedo ver cómo este sería útil.

+2

Sin duda dependerá de su flujo de trabajo. Si está utilizando rspec, puede ejecutar solo las pruebas que acaba de modificar. rspec $ (git diff --name-only) – golfadas

28

Aha, yo creo simplemente entendí la pregunta: desea nombres base? Tack en | while read a; do basename "$a"; done a cualquiera de los siguientes:

¿qué tal

  • git diff --name-only

    para cambios relativos al índice

  • git diff --name-only --staged

    para ... bien organizado chages:)

  • git diff --name-only HEAD

    tiene tanto

+0

Veo, si solo quiere _basenames_ vire esto al final de cualquiera: '| mientras lee fname; hacer el nombre base "$ fname"; hecho' – sehe

3

obtener el nombre de los archivos modificados

git status --porcelain|awk '{if($1=="M") {print "basename " $2}}'|sh

utilizo guión similar para copiar los archivos modificados a un servidor remoto, como a continuación:

git status --porcelain|awk '{if($1=="M") {print "scp " $2 " [email protected]_ip:~/my_codebase/$(dirname " $2 ")/;"} }'|sh 
+2

Hay una manera más fácil de buscar usando awk: 'git status --porcelain | awk '/^M/{print $ 2}' ' –

33

Creo que cortar es bueno para esto. caminos

git status -s | cut -c4- 
+2

y aquí estaba usando sed para quitar los códigos de estado. nunca usé la bandera -c para cortar antes. ¡bonito! agregue esto a su .gitconfig para un buen comienzo de día: 'de =! $ EDITOR $ (estado de git --porcelain | corte -c4-) & # abra todos los archivos modificados en EDITOR' –

+3

Para alguien que no esté familiarizado con' corte' comando, 'cortar -c 4-' significa, tomar caracteres del cuarto carácter. –

2

salidas de estado git relativas por lo que si hace cd en el mismo directorio que el archivo (en la raíz de su directorio de trabajo) antes de ejecutar git status que simplemente muestra los nombres base de agregado/archivos por etapas.

cd /long/path/to/my/repo/root/dir 
"stuff" > ./newfile.txt 
> git status 
# On branch master 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
#  modified: /long/path/to/my/repo/root/dir/plus/some/more/levels/of/directory/structure/inside/it/changed_file.txt 
# 
# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
#  long/path/to/my/repo/root/dir/plus/some/even/more/levels/of/directory/structure/inside/it/but_another_new_file.txt 
#  newfile.txt 
no changes added to commit (use "git add" and/or "git commit -a") 

es decir, 'newfile.txt' aparece sin la ruta completa porque estás en el mismo camino que él.

Cuestiones relacionadas