2012-01-02 12 views
4

git addを使用してuntrackedファイルを追加するスクリプトを書いています。私は私のスクリプトで使用 ループが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つの別個のファイル、Hello22.mp4とみなし、エラーで終了します。 誰かを1つのファイルとして追加する方法を知っていますか?
おかげ

+0

bash変数に大文字を使用しないでください。これらの大文字は、グローバル環境変数用に予約されています。誤ってそれらのファイルと衝突したくない場合 – SiegeX

+0

一般的に、ファイル名にはスペースを使用しないでください。下線をよく使う。 –

+0

@SiegeXはチップに感謝します。私はそれを知らなかった。私は間違いなくそれを変更します。 – harithahv

答えて

9

シェルは$(...)を単語の束に展開していますが、明らかに複数のファイルとして埋め込まれたスペースを持つファイルを明らかに解釈しています。 git addコマンドを引用するという先の提案があっても、は機能しません。 set -xと、この出力が示すように、ループは、間違った引数を指定して実行してきている。

[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 $filegit ls-files NULLがgit ls-files-zを渡すことによってファイル名を分離して使用してい引用することですヌル区切り文字とwhileループ:あなたは@AndrewFが提供するソリューションに、bashの代替を使用している

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 ..それは私に多くを意味する..私はここでスクリプティングを勉強しようとしています。あなたは私が作業を理解するのを手伝ってくれるでしょうか?Yパイプを使用する必要があります-zとwhile?最初の行にforループが必要ないのですか? – harithahv

+0

この場合、forループは使用できません。サブシェル($())がこれを "a.txt"、 "b a.txt"とし、それを "a.txt b a.txt"に変換していることと、forループがbとb.txtを認識していないことスペース以外の別の区切り文字を使用する必要があります。ヌル区切り文字が代わりに使用されます。ファイルに空白が含まれていないと仮定するのではなく、より安全なオプションです。ループでは、 'read while 'を使う必要があります。 "find"コマンドと "xargs"はどちらもNULL区切りの入力をサポートしています。あなたが選んだ答えを受け入れることを忘れないでください。 – AndrewF

+0

ありがとうAndrewF。私はそれを得た..そしてそれは素晴らしい仕事をした! :-) – harithahv

2

は引用符で$FILE VARを入れてみてください:

git add "$FILE" 

ためにスペースをできるように、ファイル名を引用だろうと。

+0

うーん..良いアイデアだったようだ...でも、 "$ FILE"として試しても、同じエラーが出る。gitはトラックしないファイル.. – harithahv

1

git add $FILEgit add "$FILE"に置き換えます。そうすれば、それは単一の要素として解釈されます。

+0

いいえ..これは動作しません.. :( – harithahv

4

場合は、DELIMを変更する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の応答は、デバッグオプション&の代わりにではなく、を使用してより有益です。
これが役立つことを願っています!

+0

うわー..ありがとう。他の代用品について知ることは、常に良いことだ。 – harithahv

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

gitが

space.txt pathtofilename/filenamewith \を追加します
関連する問題