如何编写外部git diff来比较添加的行到删除的行(并隐藏匹配)?

时间:2015-11-08 09:56:18

标签: git diff git-diff

在我的文本文件中,我经常移动大部分文件。换句话说,我选择一个长度在3到50行之间的部分,将其剪切,然后将其粘贴到文件中的其他位置。

在"未提交的更改下," Git(我使用Github OSX)将这些行显示为"删除"在文件的一部分和"添加"在另一个。

鉴于我的工作流程,如果Git的差异显示没有突出显示我只是从一个地方移动到另一个地方的部分,那将会更有帮助。相反,我希望Git只为我突出显示完全新的行,以及我从文件中完全删除的行。 (以及我改变了某些部分的行。)

有没有办法指示Git的差异显示忽略"删除" 3 +行的部分如果找到相同的"添加"文件中的其他部分?

目前我使用wdiff = diff-highlight

更新:看起来指定外部git diff很简单:

gitconfig
[diff]
    external = ~/prose-diffs.py 

有没有人有一个外部git diff来比较"添加"部分到"删除"部分(忽略开头和结尾的换行符),并自动隐藏添加的行与删除的行匹配的任何部分?

1 个答案:

答案 0 :(得分:2)

步骤大纲

  1. 差异程序 - 理解行重新排序的程序
  2. 使用新的diff程序 - 设置你的git config
  3. 差异计划:

    事实证明,git将使用以下参数调用您的diff程序:

    > my_diff_tool <filename> <old_location> <old_hash> <old_mode> <new_location> <new_hash> <new_mode>
    

    所以这里是最简单的diff工具,可以完成你想要的东西。它读取文件,然后使用set比较打印出新行和旧行。

    #!/usr/bin/python
    import sys
    
    old = open(sys.argv[2]).read().splitlines()
    new = open(sys.argv[5]).read().splitlines()
    
    print "-"* 80
    print "Filename: %s" % sys.argv[1]
    
    # Simple set method
    for line in set(old) - set(new):
        print '- %s' % line
    for line in set(new) - set(old):
        print '+ %s' % line
    if set(new) == set(old):
        print "Text reordering only"
    

    以下是输出与diff输出内容的示例:

    my_diff_tool

    Filename: test.txt
    - luctus pellentesque.
    + luctus pellentesque. Puric huma te.
    

    DIFF

    diff --git a/test.txt b/test.txt
    index 2ec8f4b..797e2ad 100644
    --- a/test.txt
    +++ b/test.txt
    @@ -4,15 +4,15 @@ dolor quis feugiat. Nullam vel interdum leo, a placerat elit. Mauris quis
     faucibus dui.
    
     Nullam eu sapien quis ex convallis tincidunt. Mauris tristique mauris ac
    -luctus pellentesque.
    +luctus pellentesque. Puric huma te.
    
     Duis at imperdiet lacus. Sed malesuada elit vitae arcu semper, at fringilla
     purus rhoncus. Sed vestibulum pellentesque libero in interdum. Fusce elementum
     ornare vulputate.
    
    +Nam sed enim at nisi tincidunt accumsan eu nec nisl. Duis suscipit hendrerit
    +fermentum. Sed mattis purus congue velit aliquet, non placerat lectus varius.
    +
     Donec placerat, purus ac aliquet ullamcorper, elit leo accumsan ante, sed
     lacinia leo sem sed metus.  Morbi lacinia porttitor ante, eget consequat
     libero accumsan in. Nunc sit amet lectus magna.
    -
    -Nam sed enim at nisi tincidunt accumsan eu nec nisl. Duis suscipit hendrerit
    -fermentum. Sed mattis purus congue velit aliquet, non placerat lectus varius.
    
    显然,还有很多需要改进的地方。例如,集合将忽略重复的行。设置也重新排序,所以如果有很多新行,就很难理解。

    这些改进留给了读者。

    使用新的差异计划

    将git配置设置为使用新工具非常简单。您也可以修改上面显示的.gitconfig

    > git config diff.external /location/to/your/diff/tool/my_diff_tool
    

    您需要确保您的差异工具是可执行的,否则您将收到错误(fatal: cannot exec '/location/to/your/diff/tool/my_diff_tool': Permission denied),所以:

    > chmod +x /location/to/your/diff/tool/my_diff_tool