Split git diff - имя-статус по разрыву строки - PullRequest
2 голосов
/ 05 января 2012

Я пытаюсь экспортировать список измененных файлов из двух коммитов с помощью git, с помощью этой команды:

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).

Это не работает, хотя. Я получаю список в следующем формате:

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

Я пытался изменить переменную IFS на $'\n' (возвращает все в одной строке), $'\t' (возвращает первую строку, например, M file1.txt) и ' ' (аналогично \t) без успех.

1 Ответ

1 голос
/ 05 января 2012
while read STATUS ADDR
do
    echo "$ADDR ($STATUS)"
done  < <(git diff --name-status HEAD..HEAD~1)

Например, для вывода git, например

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

, цикл 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)
...