Перезагрузка файлов в Git, которые показывают, как измененные, но никаких изменений по данным “ГИТ дифф”


Это , кажется, работает, но тоже довольно страшно медленно и, кажется, немного hacky мне.

IFS=$'\n'

for currentFile in $(git status | grep "modified:" | cut -c 14-)
do
    gitDiff=$(git diff "$currentFile")
    gitDiffStr="[$gitDiff]"
    if [ "$gitDiffStr" == "[]" ]
    then
        echo match
        echo git checkout "$currentFile"
        git checkout "$currentFile"
    fi
done


265
3
задан 8 февраля 2018 в 03:02 Источник Поделиться
Комментарии
1 ответ

Медленность

Медлительность, наиболее вероятно, происходит от выполнения нескольких git diffкоманды.
Более быстрый способ может быть с помощью языка программирования с ЖКТ библиотеки, которая позволит вам запустить один git diffкоманды
и итерации по записям в дифф, чтобы найти пустые.

В сокс часть

Это суховато:

git status | grep "modified:" | cut -c 14-

Выход git status это не API,
а также может быть предметом алиасы и настройки пользователя.
Это не безопасно для использования.
Когда парсинг вывода команды git,
искать --porcelain возможность сделать его безопасным.

Другое Сокс часть меняется значение IFS.
Это не огромная проблема,
но это хорошо, чтобы свести к минимуму масштабы изменений,
как правило, используя его в виде IFS=... cmd,
что бы ограничить действие изменения к исполнению cmd команду.

Наконец, некоторые незначительные проблемы стиля:


  • В $gitDiffStr переменной не имеет смысла, вы можете просто подставлять ее.

  • В == оператор в [ ... ] недокументирован. Использовать = вместо.

Альтернативная реализация

Применяя приведенные выше рекомендации, это менее замысловато, и, вероятно, так же медленно:

git status --porcelain -z | grep -z '^ M' | while IFS= read -r -d '' path0; do
path=${path0:3}
gitDiff=$(git diff "$path")
if [ "$gitDiff" = "" ]; then
echo git checkout "$currentFile"
git checkout "$currentFile"
fi
done

2
ответ дан 10 февраля 2018 в 05:02 Источник Поделиться