Tente isto:
git diff --name-only -z TREEISH.. | while IFS= read -r n; do dirname "$n"; done
- O IFS é o separador de campos de entrada, necessário para evitar o corte de espaço em branco inicial / final
- -r é necessário para evitar o processamento de barra invertida.
- As aspas em torno de "$ n" fazem com que ele lide com espaços.
Veja aqui para mais informações.