Как мне запустить линтер стиля и зафиксировать изменения, не разрушая историю мерзавца? - PullRequest
0 голосов
/ 23 февраля 2019

Позвольте мне начать с того, что я искал все выше и ниже и не нашел хорошего ответа.

Если мои изменения заключались в преобразовании только табуляции в пробелы или запуске сценария, который все делал автоматически, то этоможно было бы работать: git: изменить стиль (пробелы) без смены владельца / вины?

Я хочу запустить произвольную интерактивную очистку, такую ​​как запуск стиля linter, а затем принятие человеческих шагов для решениявопросы, как мне сделать коммит, не затрагивая мерзавца?Я вижу, что есть --reset-author, но оказывается, что автору этого коммита сбрасывается все, а не то, что нужно в этой ситуации.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

как мне сделать коммит без влияния на мерзавца

Можно чертовски близко, я думаю, что компенсация за изменения руки не будет стоить боли, но игнорировать автоматическое переформатирование изменений очень просто: git blame применяет любые преобразования текста, которые вы укажете, к содержимому файла, поэтому попросите его выполнить предварительный анализ с вашим линтером в полностью автоматическом режиме, прежде чем он проверит результаты на предмет достоверных изменений.

Вот тестовый пример, в котором «стиль линтер» просто добавляет «REFORMATTED» в качестве первого слова второй строки.и git получает указание считать его невиновным, запустив (идемпотентную версию) его как преобразование текста.

cd в каталог для мусора и скопировать его в файл temp внутри,

find ! -name temp -delete; git init
doit() { eval "$@"; shift $(($#-1)); git add .; git commit -m "$*"; }
(
doit '>file'
doit echo '>>file' line1
doit echo '>>file' line2
doit '>B'
doit sed -i "'s/line2/REFORMATTED line2/'" file '#' 'REFORMATTED line2'
doit echo '>>file' line3
) >/dev/null

set -x
git log --oneline --graph --decorate

git blame file

git config diff.REF.textconv 'awk '\''NR==2 && $1!="REFORMATTED" {$1="REFORMATTED "$1 }1'\'
mkdir .git/info
echo file diff=REF >.git/info/attributes

git blame file

затем сделайте sh temp.Ваши метаданные изменятся из-за временных меток и идентификаторов, но в противном случае вы должны увидеть

$ sh temp
Initialized empty Git repository in /home/jthill/src/snips/test/.git/
+ git log --oneline --graph --decorate
* 282c142 (HEAD -> master) line3
* ee58923 REFORMATTED line2
* d8558d2 >B
* 6801a1d line2
* 030e551 line1
* f912c83 >file
+ git blame file
030e5517 (jthill 2019-02-23 18:41:36 -0800 1) line1
ee589239 (jthill 2019-02-23 18:41:36 -0800 2) REFORMATTED line2
282c142d (jthill 2019-02-23 18:41:36 -0800 3) line3
+ git config diff.REF.textconv 'awk '\''NR==2 && $1!="REFORMATTED" {$1="REFORMATTED "$1 }1'\'''
+ mkdir .git/info
+ echo file diff=REF
+ git blame file
030e5517 (jthill 2019-02-23 18:41:36 -0800 1) line1
6801a1d6 (jthill 2019-02-23 18:41:36 -0800 2) REFORMATTED line2
282c142d (jthill 2019-02-23 18:41:36 -0800 3) line3

... в частности, обратите внимание на изменение вины за строку 2.

0 голосов
/ 23 февраля 2019

Вы все еще можете использовать общую идею, изложенную в связанном вопросе, но вы не сможете использовать от git filter-branch до запуска .Ну не напрямую.Изучите сценарий ответвления фильтра , чтобы увидеть, как он устанавливает каждый новый коммит, который он делает, чтобы сохранить имя автора и коммиттера, адрес электронной почты и отметку времени, а также узнать, какон запускает древовидный фильтр.

Так или иначе, вам придется самостоятельно написать какой-нибудь не совсем тривиальный код, чтобы запустить свой стиль, а затем получить нужную помощь.Я вижу два очевидных пути для этого:

  • Воспроизвести логику фильтра-ветвления, но в чем-то, что сохраняет состояние при нескольких запусках (например, сохранение состояния в файлах).Таким образом, вы можете запустить его, попросить запустить его до тех пор, пока он не будет нуждаться во взаимодействии, и завершить его в этот момент.Теперь вы можете исправить ситуацию и вызвать ее с помощью опции «продолжить», запустить до тех пор, пока ей снова не понадобится помощь, а затем снова остановиться.Повторяйте до тех пор, пока не сделаете.

  • Напишите или измените сценарий ответвления фильтра, чтобы во время вашего --tree-filter (это был бы тот, который нужно использовать), если он сталкивается с ситуацией, в которой он нуждаетсячеловеческая помощь, это паузы .(Возможно, в этот момент ваш древовидный фильтр прочитал инструкцию из именованного канала. Инструкцию можно ограничить просто «продолжить»: идея в том, что она на самом деле не продолжается до тех пор, пока не будет сказано, что нужно идти дальше.)

    Пока он приостановлен, вы вручную вводите временный каталог, содержащий дерево, и исправляете его.Когда все будет готово, вы отправляете инструкцию «continue» в именованный канал, и ваш древовидный фильтр затем возвращает управление в filter-branch, который продолжает свой путь, фильтруя.

Эта секундаМетод означает, что вам не нужно сохранять и загружать состояние ветки фильтра - существующий код git filter-branch просто работает как есть;Кажется, что фильтр дерева, который он запускает, иногда оказывается настолько медленным, что занимает минут вместо нескольких секунд.

...