2015-11-08 46 views
7

在我的文本文件,我经常走动大的部分。换句话说,我将一段长度为3到50行的段切下,然后在文件的其他地方将其粘贴。如何编写一个外部的git diff比较添加的行到删除的行(并隐藏匹配)?

在“未提交的变化,” GIT中(I使用Github的OSX)显示这些行作为在该文件的一个部分“已删除”,而在另一个“添加的”。

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

如果在文件的其他地方找到相同的“添加”部分,是否有办法指示Git的差异显示忽略3行以上的“已删除”部分?

目前我使用wdiff = diff-highlight

更新:它看起来像指定外部git的差异非常简单:

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

没有人有一个外部git的差异是比较“补”部分以“删除”部分(忽略换行的开头和结束),并自动隐藏添加的行与删除的行匹配的任何部分?

+2

不能与内置的差异,但你可以有混帐使用“外部差异”。这仍然会发现(或写作)这样的差异(这就是为什么这是一个评论,而不是答案)的问题。 – torek

+1

我在这种情况下使用的一个技巧是在比较之前以某种方式使文本文件“规范”。通常,我将它们排序并比较排序后的文件。在某些情况下,需要删除缩进或一些标点符号。 –

+0

@torek程序员编写这样的差异有多难?一旦写入,像Github Desktop OSX或Sourcetree这样的GUI客户端能够使用外部差异吗? – incandescentman

回答

2

的步骤的轮廓

  1. 比较差异程序 - 一个能够理解线重排序
  2. 使用新的diff程序 - 设定你的混帐配置

比较差异程序:

因此,原来git会打电话给你的差异PROGR我有以下论点:

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

所以这里是最简单的可能的差异工具,做一些接近你想要的东西。它读取文件,然后使用设置比较打印新行和旧行。

#!/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" 

这里是什么这个输出VS为例什么差异将输出:

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. 

显然,有不少地方需要改进。例如,集合将忽略重复的行。设置也重新排序,因此很难理解是否有大量新行。

这些改进是作为练习留给读者。

使用新的diff程序

设置你的混帐配置为使用新的工具很容易。您也可以修改您的.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 
+1

有趣的方法。 +1 – VonC

相关问题