2012-01-02 76 views
4

我一直在编写脚本来添加使用git add未跟踪的文件。 我在脚本中使用的循环是不能添加一个文件与空间分隔git

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个独立文件,您好22.mp4并退出时出错。 有人知道如何将其添加为单个文件吗?
感谢

+0

不要为您的bash变量使用大写字母,这些变量只能用于全局环境变量。您不想意外碰撞其中一个 – SiegeX 2012-01-02 04:44:07

+0

并且作为一般规则,请勿在文件名中使用空格。更好地使用下划线。 – 2012-01-02 05:37:58

+0

@SiegeX感谢您的提示。我没有意识到这一点。我一定会改变它。 – harithahv 2012-01-02 05:56:21

回答

9

发生了什么事是外壳扩展$(...)成一堆话,而这显然解释嵌入为多个文件显然空格的文件。 即使提前引用git add命令的建议,它也不会起作用。通过传递-zgit ls-files和使用

[email protected]:~/test$ ls -1 
a a 
[email protected]:~/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分开的文件名:所以循环得到与错误的参数运行,与set -x显示该输出而循环使用空分隔符:

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 
+0

嘿..那工作..感谢AndrewF ..这对我来说意味着很多..我是一个新手在这里试图研究脚本..可以你能帮我理解工作吗?我们应该使用管道,-z和while?我们不需要在第一行使用'for'循环吗? – harithahv 2012-01-02 06:12:29

+0

对于这种情况,你不能使用for循环。 subhell($())将这个“a.txt”,“b a.txt”并将其转换为“a.txt b a.txt”并且for循环不知道b和b.txt你必须使用不同于空格的分隔符,而是使用null分隔符,更不用说它总是更安全的选择,而不仅仅是假设文件不包含空格,因为你不能使用for循环,你必须使用'while read'。你会发现“find”命令和“xargs”都支持NULL分隔输入。不要忘记接受你选择的答案。 – AndrewF 2012-01-02 06:18:18

+0

谢谢AndrewF。我明白了..它效果很棒! :-) – harithahv 2012-01-02 08:11:45

2

尝试把$FILE VAR引号:

git add "$FILE" 

那将引用的文件名,从而允许它的空间。

+0

嗯..这似乎是一个好主意......但即使尝试作为“$文件”后,我收到相同的错误..意味着git不跟踪该文件.. – harithahv 2012-01-02 05:58:59

1

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

+0

没有..这不工作.. :( – harithahv 2012-01-02 05:59:33

4

如果你正在使用bash替代由@AndrewF提供的解决方案,你可以使用bash的IFS内部变量的改变DELIM从空间到换行符,这些行上的东西:

(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的反应更丰富,涵盖调试选项&而不是for的用法。
希望这有助于!

+0

哇..谢谢..了解其他替代品总是很好的.. – harithahv 2012-01-02 08:08:46

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 '{}'" 
0

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

混帐添加pathtofilename/filenamewith \ space.txt