Editar:
Uma solução pode ser definir core.fileMode variable como false no seu ~/.gitconfig . Isso faz com que o git ignore o bit executável.
Se você estiver usando um sistema de arquivos FAT, talvez queira definir core.ignorecase para true também.
Resposta antiga
Assumindo que você confirmou na caixa Linux, você pode usar um gancho, neste caso .git/hooks/pre-commit :
#!/bin/sh
find . -type f -not -perm 0644 -exec chmod 644 {} \+
find . -type d -not -perm 0755 -exec chmod 755 {} \+
git add .
Isso é um pouco grosseiro no sentido de que força todos os arquivos e diretórios para uma determinada permissão. Você pode querer adicionar comandos chmod para arquivos específicos se eles precisarem de outras permissões entre find e git add . Por outro lado, é curto e simples.
Uma solução mais complexa pode usar git diff --cached --name-only para verificar quais arquivos serão realmente confirmados e consertar apenas aqueles. Mas isso seria mais complexo e não corrigiria mudanças aleatórias de permissão.
#!/bin/sh
FILES=$(git diff --cached --name-only)
chmod 644 $FILES