我一直在写一个脚本,使用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个单独的文件, Hello和22.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