Existe uma diferença entre:
PARMS+="... --exclude='.git'"
e
... --exclude='.git'
No primeiro, aspas simples estão dentro das próprias citações, então elas estão literalmente presentes no texto substituído dado a rsync como argumentos. rsync obtém um argumento cujo valor é --exclude='.git' . No segundo, as aspas simples são interpretadas pelo shell no momento em que são escritas, porque elas não estão entre aspas e rsync consegue ver --exclude=.git .
Neste caso, você não precisa das aspas simples - .git é uma palavra de shell perfeitamente válida por si só, sem caracteres especiais, então você pode usá-la literalmente no comando.
Melhor para esse tipo de coisa, no entanto, é um array :
PARMS=(-rvu)
PARMS+=(--delete --exclude='.git')
rsync "${PARMS[@]}"
Isso constrói o seu comando como palavras separadas, com qualquer citação que você queira interpretar no momento em que você escreve a linha do array. "${PARMS[@]}" expande para cada entrada na matriz como um argumento separado , mesmo se o argumento em si tiver caracteres ou espaços especiais, então rsync vê o que você escreveu como quis dizer.