Сравните преобразованный (удаленный и созданный) файл с git - PullRequest
0 голосов
/ 14 февраля 2019

Я делаю много преобразований из Java в Kotlin.Рассматривать запросы на получение с большим количеством таких преобразований сложно, потому что git не распознает, что удаление Example.java «принадлежит» созданию Example.kt.Это означает, что мне нужно посмотреть на разность удаленного файла в одном окне и на вновь созданный файл в другом окне.

Мне интересно, есть ли простой способ получить вид рядом, предпочтительноиспользуя командную строку git.Так как языки в моем случае, Java и Kotlin, имеют довольно большие различия, git не сможет выровнять преобразованные строки друг с другом.Тем не менее, этот вопрос более общий: можно ли показывать параллельное сравнение для сравнения двух разных файлов?Предположим, что в коммите A у нас есть Example.java, и этот коммит B преобразует его из Java в Kotlin в Example.kt.

В качестве бонуса, может ли этот элемент бок о бок diff выровнять преобразованные строки для преобразований Java в Kotlin?Я думаю, это не простая задача, потому что инструмент сравнения должен иметь некоторое представление о том, что происходит на уровне языка (а не только о различиях символов на уровне исходного файла) и сравнивать эти похожие части рядом друг с другом.Но кто знает, может, кто-нибудь знает, как этого добиться?

1 Ответ

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

Довольно просто сгенерировать пары в любой достаточно современной системе:

git diff --name-status --diff-filter=AD @~| awk -F$'\t' '
        BEGIN { AD["A"]["/"]; AD["D"]["//"] }
        { base=$2; sub(/\.[^.]*$/,"",base); AD[$1][base]=$2 }
        END {   for ( k in AD["D"] )
                        if ( AD["A"][k] )
                                print AD["D"][k]"\t"AD["A"][k]
        }'

Строка BEGIN просто устанавливает AD как массив массивов с несовпадающими базовыми именами эрзаца,sub строка запоминает добавленные и удаленные файлы по базовому имени, а блок END выводит пары совпадающих базовых имен.

В любом случае в linux легко разбивать команды на проверку пар,

# (the above, just printing the right commands:)
git diff --name-status --diff-filter=AD @~| awk -F$'\t' '
        BEGIN { AD["A"]["/"]; AD["D"]["//"] }
        { base=$2; sub(/\.[^.]*$/,"",base); AD[$1][base]=$2; }
        END {   for ( k in AD["D"] )
                        if ( AD["A"][k] )
                                print "vim -O <(git show @~:"AD["D"][k]")\t"AD["A"][k]
        }'

и выбирать пары, которые вы хотите проверить.

Вы можете довольно легко заставить Gitзапустите его diff для произвольно конвертированного текста, найдите "Git textconv", но я думаю, что любой синхронизатор будет работать в обратном направлении от визуализированного текста до оригиналов, которые его произвели, будет проектом.

...