2012-05-04 14 views
15

Estoy usando msysgit (1.7.9), y estoy buscando la invocación correcta del comando git ls-files para mostrar solo los archivos y directorios (rastreados) en el nivel actual, ya sea desde el índice, o el trabajo actual directorio si eso es más fácil.cómo `git ls-files` para un solo nivel de directorio.

Básicamente daría una lista de directorios similar a la que vería en Github. Viniendo de Windows, no estoy muy familiarizado con la forma correcta de hacer globbing (?).

Respuesta

14

Creo que quieres git ls-tree HEAD sed'd al gusto. La segunda palabra de la salida de ls-árbol será tree para directorios, blob para archivos, commit para submodulesm, el nombre del archivo es todo después de la pestaña ascii

+1

'git ls-files | awk -F/'{print $ 1}' | uniq | xargs ls -dl --color = auto' – iegik

+0

@iegik Esto es mucho mejor. Me gustaría 's s, /. * ,,' en lugar del awk, solo porque es más corto. Haga esto una respuesta, por favor? Lo recompensaré. – jthill

+0

No funciona en macOS - 'ls: opción ilegal - -'. Creo que quieres, al menos en macOS, '... | xargs 'ls' -Gdl' - ¿alguien más puede verificar si eso también funciona en Linux? – ELLIOTTCABLE

12

Creo que git ls-tree --name-only [branch] hará lo que está buscando.

+1

Gracias, eso es 95% el camino hasta allí. Su 'git ls-tree --name-only [branch]' lista los directorios y archivos en la misma lista (es decir, no '' para los directorios). Encontré 'git ls-tree -d --name-only [branch]' listará solo los directorios. Parte del 'problema' es detectar directorios de submódulos. –

+0

¡Esta debería ser probablemente la respuesta aceptada! Eso, o es un muy buen comienzo para uno. : D – ELLIOTTCABLE

+0

@PhilipOakley. Estaba tratando de hacer algo similar, excepto con 'git ls-files' en lugar de' git ls-tree'. Con 'git ls-files', parece que la opción equivalente es' --directory' (en ese comando, '-d' es la abreviatura de' --deleted'). –

3

Para Basta con enumerar los archivos en el directorio de trabajo actual que se realiza un seguimiento por git, he encontrado que la siguiente es varias veces más rápido que usar git ls-tree...:

ls | grep -f <(git ls-files) 

que tomaría un poco de jugar un poco con sed si también quería incluir directorios, algo a lo largo de las líneas de:

ls | grep -f <(git ls-files | sed 's/\/.*//g' | sort | uniq) 

asumiendo que no tiene ningún '/' caracteres en los nombres de sus archivos. Así como ...

ls -a | grep -f <(git ls-files | sed 's/\/.*//g' | sort | uniq)

también con el fin de lista de "invisible" archivos (aún sin seguimiento).

+0

Esto es bueno ... Me pregunto por qué no puedo agregarlo como '[alias]' ?? 'ls-tracked ="! f() {ls | grep -f <(git ls-files | sed 's /\/.*// g' sort | uniq);}; f "' -> 'fatal: archivo de configuración incorrecto' –

4

git ls-tree <tree-ish> es bueno y todo, pero no puedo encontrar la manera de especificar el índice como el <tree-ish>. (Aunque estoy seguro de que hay muchas posibilidades de encontrar algo de todos los capuchones de referencia para hacer precisamente eso.)

De todos modos, ls-files funciona de manera implícita en el índice de modo que bien podría utilizar lo siguiente:

$ git ls-files | cut -d/ -f1 | uniq 

Esto demuestra archivos y directorios solo en el directorio actual.

Cambiar cut-f argumento para controlar la profundidad. Por ejemplo, -f-2 (que es tablero dos) muestra los archivos y directorios de hasta dos niveles de profundidad:

$ git ls-files | cut -d/ -f-2 | uniq 

Si se especifica el argumento <path> a ls-files, asegúrese de aumentar -f para dar cabida a los directorios principales:

$ git ls-files foo/bar | cut -d/ -f-3 | uniq 
+0

Puede obtener un árbol para el índice con ['git write-tree'] (https://git-scm.com/docs/git-write-tree). – jthill

0

Me sorprende que esto sea tan difícil ... pero no me hablen de mis quejas sobre git.

Una variante de la respuesta de jthill parece ser posible (hey, soy lingüista, tengo una licencia para hacer nuevas palabras).La variante es

ls -d `git ls-tree HEAD | sed -e "s/^.*\t//"` 

Esto utiliza 'ls' para dar formato a la salida, para que pueda obtener un código de colores (si se utiliza eso), etc. También funciona como un alias:

alias gitls='ls -d `git ls-tree HEAD | sed -e "s/^.*\t//"`' 

Fwiw, también puede alias el comando recursivo, por lo que usó el formato 'ls' (por ejemplo, si su ruta + nombre de archivo no es demasiado larga, obtendrá dos columnas de salida, código de colores de ejecutables, etc.)

alias gitls-r='ls `git ls-files`' 
Cuestiones relacionadas