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)