让我们说我想比较两个日志文件的差异(不是我的真实用例,但很好指出问题),但是因为它们在开头有时间戳,而且这些时间戳明显不同,它们& #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行的内容不同 - something3
与something4
。
我现在所做的是在使用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
标志。
答案 0 :(得分:1)
假设两个修订版本为commit1
和commit2
,则存储库中的文件路径为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
。