2012-01-02 36 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