我一直在编写一个脚本来使用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 并退出并显示错误。
有人知道如何将其添加为单个文件吗?
感谢
答案 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