¿Cómo obtener el estado de git de una sola subcarpeta?

81

Cuando hago git status en una subcarpeta de mi repositorio, también incluye el estado de las carpetas principales.

¿Hay alguna forma de restringir git-status a solo una carpeta en particular?

EoghanM
fuente
1
no, "estado git". da carpetas de hermanos como, por ejemplo, "../sibling"
EoghanM
¿Le importaría dar un poco más de contexto sobre por qué desea filtrar los cambios en otras partes de su árbol? ¿En qué situaciones le gustaría utilizar esta función?
Greg Bacon
1
Si hay más de una pantalla completa de salida del comando normal "git status"
EoghanM
3
posible duplicado del estado
pal4life

Respuestas:

100
git status .

mostrará el estado del directorio y subdirectorios actuales.

Por ejemplo, archivos dados (números) en este árbol:

a/1
a/2
b/3
b/4
b/c/5
b/c/6

del subdirectorio "b", git statusmuestra nuevos archivos en todo el árbol:

% git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   ../a/1
#   new file:   ../a/2
#   new file:   3
#   new file:   4
#   new file:   c/5
#   new file:   c/6
#

pero git status .solo muestra archivos en "b" e inferiores.

% git status .
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   3
#   new file:   4
#   new file:   c/5
#   new file:   c/6
#

Solo este subdirectorio, no debajo

git status .muestra todos los archivos debajo de "b" de forma recursiva. Para mostrar solo los archivos en la "b", pero no debajo, debe pasar una lista de solo los archivos (y no los directorios) a git status. Esto es un poco complicado, dependiendo de tu caparazón.

Zsh

En zsh puede seleccionar archivos ordinarios con el "calificador glob" (.). Por ejemplo:

% git status *(.)
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4

Intento

Bash no tiene calificadores glob, pero puede usar GNU findpara seleccionar archivos ordinarios y luego pasarlos git statusasí:

bash-3.2$ find . -type f -maxdepth 1 -exec git status {} +
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4

Esto usa -maxdepthque es una extensión de búsqueda de GNU . POSIX find no tiene -maxdepth, pero puede hacer esto:

bash-3.2$ find . -path '*/*' -prune -type f -exec git status {} +
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4
Matt Curtis
fuente
2
Lo siento, tardé tanto en volver a esta respuesta: ¡simple y correcta! Me pregunto si <pathspec> se agregó al estado de git después de mi pregunta.
EoghanM
¿Qué sucede si solo está interesado en la carpeta actual a la que se .refiere, pero no en sus subcarpetas? ¿Alguna solución para eso? ¡Gracias!
benjaminz
@benjaminz depende de su uso; para cosas como esa, utilizo el globbing de shell para seleccionar archivos pero no subdirectorios, por ejemplo (para zsh) git status *(.). Bash no tiene una forma abreviada de agrupar solo archivos, pero podría usar un findejemplo extendido find . -type f -maxdepth 1 -exec git status {} +. Parece el tipo de cosas que le gustaría poner en un alias o script en lugar de escribir todo el tiempo.
Matt Curtis
3

Algunos comandos de plomería toman un directorio como parámetro:

git ls-files -t -o -m aDirectory

le daría todos los archivos modificados pero no actualizados (no agregados al escenario), o sin seguimiento. Y eso para un directorio.

Como está escrito en este hilo , git ls-files no admite la --addedopción ' .

La razón más fundamental es que la ls-filesplomería se trata del índice .
Agregado no se trata de una comparación entre el índice y el árbol de trabajo.
Está entre la confirmación HEAD y el índice, y no pertenece a la plomería de archivos ls.

Entonces, usando los comandos mencionados aquí :

git diff-index --name-only -B -R -M -C HEAD src

le daría archivos agregados y no agregados

git diff-files --name-only -B -R -M -C src

le daría solo archivos no agregados. (mientras detecta reescrituras, renombramientos, copias, ...)

Como es habitual con los comandos de plomería, algunas secuencias de comandos están en orden;)

VonC
fuente
3

Imperfecto, pero esto también funciona desde el directorio que le interesa:

git status | grep -v ' \.\./'

Eso ocultará todos los directorios que requerirían una referencia ascendente en su ruta relativa.

Si desea que el color salga por el otro extremo, establezca color.statusen always:

git config color.status always
Marcus Griep
fuente
2
Me encanta cómo grep siempre ofrece una solución improvisada si no conoces una más específica. Saludos a la programación de taco-bell.
murftown
¡Esto es mucho más poderoso!
benjaminz
2

Es posible restringir git statusal directorio actual (sin carpetas secundarias) dando una especificación de ruta usando la palabra mágica globy *::

git status ':(glob)*'
Joël Conraud
fuente
¡Esto funciona muy bien! ¡Exactamente lo que estaba buscando!
poindexter
1

Cuando probé git, no encontré la manera de hacerlo.

Terminé haciendo:

x@x:~/x$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       b
#       main/a
nothing added to commit but untracked files present (use "git add" to track)

x@x:~/x$ git status | grep main
#       main/a
Macarse
fuente
Este es el método que estaba usando ... lo siguiente también obtiene los encabezados de estado: git status | grep "main \ |: \ $" ... desafortunadamente, pierde el color.
EoghanM
Encontré esta pregunta buscando una coincidencia global genérica. Este es, con mucho, el más fácil y funciona para mí, por ejemplo, git status | grep extdonde ext es la extensión. ¡Gracias!
0

cd YOUR_REQUIRED_DIRECTORY, luego,
git status.

Ratna Halder
fuente
esto mostrará una lista de subdirectorios si proporciona la opción de archivos sin
seguimiento