Mantenha a simplicidade; procure o diretório .git
e execute seus comandos a partir de seu diretório contido. Também lance um -print
para ver em que diretório está sendo executado:
find . -type d -name .git -print -execdir git symbolic-ref --short HEAD \;
(Ok, na verdade -print
mostra o diretório encontrado - ./path/to/repo/.git
, não o ./path/to/repo/
em si. Mas isso é um pequeno inconveniente.)
EDIT: Você pode produzir a saída EXACT solicitada no seu OP da seguinte forma:
paste <(ls -ld *) <(for i in *; do if [ -d "$i"/.git ] ; then echo "($(git --git-dir="$i"/.git symbolic-ref --short HEAD))"; else echo; fi; done)
Isso não tem nenhuma desvantagem real que eu possa ver.
Por padrão, ele só encontra reit git de nível superior, ou seja, se o diretório "Data" (no seu exemplo ls
output) tiver subdiretórios que são git repos, eles não serão listados, enquanto com o comando find
I deu anteriormente eles seriam. Mas como eu digo, é por design.
Isso não preserva as cores na saída de ls
. Você pode fazer isso adicionando um --color=always
ao comando ls
incorporado:
paste <(ls -ld --color=always *) <(for i in *; do if [ -d "$i"/.git ] ; then echo "($(git --git-dir="$i"/.git symbolic-ref --short HEAD))"; else echo; fi; done)
Embora, por algum motivo, isso produza uma nova linha extra no final de toda a saída. Ah bem; não é um grande negócio IMO.
Para o Mac OS, ls
não tem um sinal --color
, portanto, use o seguinte para forçar a saída de cores:
paste <(CLICOLOR_FORCE=true ls -ld *) <(for i in *; do if [ -d "$i"/.git ] ; then echo "($(git --git-dir="$i"/.git symbolic-ref --short HEAD))"; else echo; fi; done)