不能添加用空格分隔的文件给git

我一直在写一个脚本,使用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之间有一个空格 )。 上面的循环将把文件作为2个单独的文件, Hello22.mp4,并退出时出错。 有人知道如何将其添加为单个文件吗?
谢谢

正在发生的事情是,shell将$(...)扩展成一堆文字,显然它将空格嵌入为多个文件。 即使有前面的引用git add命令的建议,它也不起作用 。 所以循环得到了错误的参数运行,如下面的输出所示: set -x

 ubuntu@up:~/test$ ls -1 aa 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 

如果您使用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的反应是更多的信息覆盖调试选项和使用,而不是。
希望这可以帮助!

尝试将$FILE var放在引号中:

 git add "$FILE" 

这会引用文件名,从而允许它的空间。

git add $FILE替换git add $FILE git add "$FILE" 。 这样它将被解释为一个单一的元素。

我知道这是非常晚,但这是使用标准的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 '{}'" 

要添加为单个文件,请在文件名的空格之前添加反斜杠:

git add pathtofilename / filenamewith \ space.txt