比较转换(删除和创建)的文件与git

时间:2019-02-14 18:45:27

标签: java git kotlin refactoring diff

我做了很多从Java到Kotlin的转换。复查具有大量此类转换的请求请求很困难,因为git无法识别出Example.java的删除“属于”创建Example.kt。这意味着我必须在一个窗口中查看已删除文件的差异,而在另一窗口中查看新创建的文件。

我想知道是否有一种简单的方法来获取并排视图,最好使用git命令行。由于在我的情况下,Java和Kotlin的语言有很多差异,因此git可能无法使转换后的行彼此对齐。但是,这个问题更为笼统:可以显示并排diff比较两个不同的文件吗?假设提交A处有Example.java,提交B将其从Java转换为Kotlin并转换为Example.kt。

作为奖励,此并排diff能否将Java到Kotlin转换的转换行对齐?我猜这不是一件容易的事,因为diff工具需要对语言级别上发生的事情有所了解(而不仅仅是源文件级别上的字符差异),并比较那些相似的部分。但是谁知道,也许有人知道实现这一目标的方法?

1 个答案:

答案 0 :(得分:0)

在任何合理的最新系统上生成配对非常容易:

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设置为ersatz基名不匹配的数组,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在任意转换的文本上运行其差异,找到“ Git textconv”,但是我认为让任何同步器从渲染的文本向后转换为生成它的原始文档都是一个项目。