运行git diff时忽略文件中的某些行

时间:2017-12-08 10:17:26

标签: git git-diff

让我们说我想比较两个日志文件的差异(不是我的真实用例,但很好指出问题),但是因为它们在开头有时间戳,而且这些时间戳明显不同,它们& #39; ll将每一行显示为不同。

让我们考虑这个(愚蠢的)例子:

00:00:05 something1     00:00:06 something1
00:00:06 something2     00:00:07 something2
00:00:07 something__3   00:00:08 something__4
00:00:08 something5     00:00:09 something5

此处我们并排显示2个日志,每个行的时间差异不同,但只有第3行的内容不同 - something3something4

我现在所做的是在使用Notepad ++之前擦除时间戳,但这需要很多手动工作,尤其是手动工作。对于许多文件。我宁愿告诉git diff在对文件进行区分之前先对文件应用过滤器。

这可能吗?我在这里看到了这个问题 - https://unix.stackexchange.com/questions/17040/how-to-diff-files-ignoring-comments-lines-starting-with,他们在那里讨论diff -u -I '#.*' test{1,2},但是git diff并没有认出-I标志。

1 个答案:

答案 0 :(得分:1)

假设两个修订版本为commit1commit2,则存储库中的文件路径为foo/bar.log

git diff -U0 \
$(git cat-file -p commit1:foo/bar.log | awk '{$1=""}1' | awk '{$1=$1}1' | git hash-object --stdin -w) \
$(git cat-file -p commit2:foo/bar.log | awk '{$1=""}1' | awk '{$1=$1}1' | git hash-object --stdin -w)

git cat-file -p commit1:foo/bar.log打印一个修订的文件内容。 awk删除第一个字段,即时间戳。 git hash-object --stdin -w创建了一个blob。 git diff比较两个blob。 -U0从输出中删除上下文。

这两个斑点正在晃来晃去。您可以运行git gc --prune=now来删除它们。你也可以让他们独自一人,因为他们将在几天内被消灭。

~/.bashrc中的示例函数:

function difflog() {
    local left=$1
    local right=$2
    local path=$3
    git diff -U0 \
        $(git cat-file -p ${left}:${path} | awk '{$1=""}1' | awk '{$1=$1}1' | git hash-object --stdin -w) \
        $(git cat-file -p ${right}:${path} | awk '{$1=""}1' | awk '{$1=$1}1' | git hash-object --stdin -w)
    git gc --prune=now --quiet
}

要调用该函数difflog HEAD HEAD~1 foo/bar