git: estado corto con nombres terminados en NUL Y routes relativas

Quiero get la salida de git en el status -s formatting status -s :

 genesis% git status -s . ?? .config/aria2/ ?? .config/htop/ ?? .config/mc/ ?? .config/pacman/ ?? .config/remmina/ ?? .config/teamviewer/ ?? .config/zsh/ 

Pero quiero esta list con nombres de file terminados `\ 0 'para tratar de forma segura los files con caracteres extraños en sus nombres.

 genesis% git status -z . | xargs -0n1 echo ?? misc/.config/aria2/ ?? misc/.config/htop/ ?? misc/.config/mc/ ?? misc/.config/pacman/ ?? misc/.config/remmina/ ?? misc/.config/teamviewer/ ?? misc/.config/zsh/ 

Como puede ver, la salida -z proporciona routes relativas a la raíz del repository (el misc adicional).

¿Cómo puedo get los nombres de las routes relativas como en el primer ejemplo, pero todavía tienen NUL -terminated?

No puede get lo que quiere directamente. Sin embargo, como -z está destinado al consumo por código en lugar de por humanos, puede agregar un poco de su propio código para hacer lo que quiera, utilizando git rev-parse --show-cdup :

 $ git rev-parse --show-cdup ../ 

Esto indica que falta un componente de nivel superior del directory de trabajo actual, por lo que después de get las inputs de directory limitado a actual a través de -z , debe quitarse el primer componente de cada nombre. Si --show-cdup imprimió ../../ necesitaría quitar dos, y así sucesivamente.

Tenga en count que --show-cdup no imprime nada, o más precisamente, una línea en blanco, cuando no hay componentes para quitar. Por lo tanto, contar el número de ../ (o incluso solo / ) en la salida de --show-cdup le da el número correcto de componentes de nombre de ruta líder para pelar.

(Si está proporcionando algún argumento que no sea . git status , necesitará aún más: compruebe si el argumento es un directory, si es así, cd y ejecute git rev-parse --show-cdup , y si es un file, obtenga su nombre de directory o . , cd en eso, y ejecute git rev-parse --show-cdup . Haga todo esto desde un subprocess para evitar modificar el directory de trabajo actual del process principal. Este método bastante enrevesado evita tener que escriba resolvedores de nombres de ruta para manejar numbers arbitrarios de componentes ./ y ../ , pero también puede ir por la otra ruta e ir directamente a paths completos con ruta realpath , asumiendo entornos similares a POSIX de todos modos).