2012-01-05 23 views
2

私は、このコマンドを使用して、gitの2つのコミットから変更されたファイルのリストをエクスポートしようとしている:分割gitのdiffを--name-状態

read -ra ADDR <<< `git diff --name-only HEAD..HEAD~1 | sed -e "s/ /\\\ /g"` 
for i in "${ADDR[@]}"; do 
    echo "$i" 
done 

これが正常に動作します。私は、新しい行に各ファイルを入れて素敵なリストを端末に出力します。

file1.txt 
file2.txt 
file3.txt 

しかし、私は--name-statusの代わり--name-onlyを使用します。その理由は、後にどのような変更が行われたかによって、後で異なることができるからです(たとえばMまたはD)。

これは動作しません。 (\tと同じ)私はIFS$'\n'に変数(1行上のすべてを返す)、$'\t'(例えばM file1.txt、最初の行を返す)と' 'を変更しようとしてい

M 
file1.txt 
M 
file2.txt 
M 
file3.txt 

:私は、次の形式でリストを取得します成功なし。

+0

はあなただけ追加することができます。ちょうどある行を削除するために、あなたのsedスクリプトに「/^M $/D」 M.幸運。 – shellter

+0

'git diff -name-status .. 'を実行すると、ファイル名のリストが表示され、最初のカラムにステータスが表示されます。あなたの 'sed'コマンドがあなたに何を提供しているのか分かりません。私のbashは最高ではないので、例を挙げることはできませんが、あなたはawkで望みを得ることができると思います。 http://www.thegeekstuff.com/2010/01/awk-introduction-tutorial-7-awk-print-examples/ – lhagemann

答えて

1
while read STATUS ADDR 
do 
    echo "$ADDR ($STATUS)" 
done < <(git diff --name-status HEAD..HEAD~1) 

など。

M  INSTALL 
M  debian/changelog 
M  src/lib/libnvpair/SConscript 
M  src/lib/libzfscommon/SConscript 
M  src/lib/libzpool/SConscript 
M  src/zfs-fuse/main.c 

のようなgitの出力のためのwhileループによって印刷され、次の

INSTALL (M) 
debian/changelog (M) 
src/lib/libnvpair/SConscript (M) 
src/lib/libzfscommon/SConscript (M) 
src/lib/libzpool/SConscript (M) 
src/zfs-fuse/main.c (M) 
+0

sigh。それを正しくするには、いくつかの忍者編集が必要でした。今すぐ完了: – sehe

+0

魅力のように動作します、ありがとう! – Magnus