无法添加用空格分隔的文件到git

时间:2012-01-02 04:38:41

标签: linux git bash scripting commit

我一直在编写一个脚本来使用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 个答案:

答案 0 :(得分:10)

正在发生的事情是shell正在将$(...)扩展为一堆单词,显然它解释了一个空间嵌入多个文件的文件。 即使先前引用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并使用一段时间循环使用空分隔符:

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

答案 1 :(得分:4)

如果你使用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 :(得分:2)

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

git add "$FILE"

引用文件名,从而允许空格。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我知道这已经很晚了但是这是使用标准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 '{}'"

答案 5 :(得分:0)

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

git add pathtofilename / filenamewith \ space.txt