Происходит то, что оболочка расширяет $(...)
на кучу слов и, очевидно, интерпретирует файл с пробелами, встроенными в несколько файлов. Даже при предыдущих предложениях цитирования команды git add
она не будет работать . Таким образом, цикл запускается с неверными аргументами, как показано в этом выводе с set -x
:
ubuntu@up:~/test$ ls -1
a a
ubuntu@up:~/test$ set -x; for FILE in $(git ls-files -o --exclude-standard); do git add "$FILE"; git commit -m "Added $FILE"; done
+ set -x
++ git ls-files -o --exclude-standard
+ for FILE in '$(git ls-files -o --exclude-standard)'
+ git add a
...
Правильное решение - заключить в кавычки git add $file
и иметь git ls-files
NULL для разделения имен файлов, передав -z
в git ls-files
и использовать цикл while с нулевым разделителем:
git ls-files -o --exclude-standard -z | while read -r -d '' file; do
git add "$file"
git commit -m "Added $file"
git push origin master
done