Не могу добавить файл, разделенный пробелом в git - PullRequest
4 голосов
/ 02 января 2012

Я пишу скрипт для добавления неотслеживаемых файлов с помощью git add.Цикл, который я использую в своем скрипте:

for FILE in $(git ls-files -o --exclude-standard); do  
git add $FILE  
git commit -m "Added $FILE"  
git push origin master  
done 

Скрипт работает нормально, пока не встретится с именем файла, в котором есть пробел.Например, я не могу добавить файл Hello 22.mp4. (Обратите внимание, что между Hello и 22 существует SPACE ).Вышеупомянутый цикл будет принимать файл как 2 отдельных файла, Hello и 22.mp4 и завершаться с ошибкой.Кто-нибудь знает, как добавить его в один файл?
Спасибо

Ответы [ 6 ]

10 голосов
/ 02 января 2012

Происходит то, что оболочка расширяет $(...) на кучу слов и, очевидно, интерпретирует файл с пробелами, встроенными в несколько файлов. Даже при предыдущих предложениях цитирования команды 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
4 голосов
/ 02 января 2012

Если вы используете bash, альтернативный решению, предоставленному @AndrewF, вы можете использовать внутреннюю переменную IFS bash, чтобы изменить разделитель от пробела до новой строки, что-то в этих строках:

(IFS=$'\n'
for FILE in $(git ls-files -o --exclude-standard); do  
git add $FILE  
git commit -m "Added $FILE"  
git push origin master  
done 
)

Это только для вашей информации. Ответ AndrewF является более информативным, включая опцию отладки и использование while вместо for.
Надеюсь, это поможет!

2 голосов
/ 02 января 2012

Попробуйте поместить $FILE переменную в кавычки:

git add "$FILE"

Это будет заключать в кавычки имя файла, таким образом оставляя пробелы в нем.

1 голос
/ 02 января 2012

Заменить git add $FILE на git add "$FILE". Таким образом, он будет интерпретирован как один элемент.

0 голосов
/ 12 декабря 2016

Чтобы добавить как один файл, добавьте обратную косую черту перед пробелом в имени файла:

git add pathtofilename / filenamewith \ space.txt

0 голосов
/ 12 августа 2016

Я знаю, что это очень поздно, но вот один из способов сделать это с помощью стандартной команды xargs linux:

git ls-files -o --exclude-standard | xargs -L 1 -I{} -d '\n' git add '{}'

Вы можете проверить это, просто повторив команду следующим образом:

git ls-files -o --exclude-standard | xargs -L 1 -I{} -d '\n' echo "git add '{}'"
...