2015-05-19 26 views
1

我正在尝试构建文件的逐行历史记录,并且在使用--word-diff模式时我得到了奇怪的行为git diff/git log ...命令。它有时会合并一些行。获取有关git word-diff合并行的信息

例如,如果旧版本文件的是:

r = ioctl(hdev->control, VHOST_SET_LOG_BASE, 
    (uint64_t)(unsigned long)hdev->log); 

其转换为:

r = hdev->vhost_ops->vhost_call(hdev, VHOST_SET_LOG_BASE, hdev->log); 

(这些线是从this项目,GPL许可证下发布)

简单git diff给我正常输出(删除了2行,添加了1行),但是git diff --word-diff给了我这个:

r = [-ioctl(hdev->control,-]{+hdev->vhost_ops->vhost_call(hdev,+} 
    VHOST_SET_LOG_BASE, [-(uint64_t)(unsigned long)hdev->log);-]{hdev->log);} 

相同的输出将在--word-diff=porcelain模式下发出,它不是文本模式的错误。

由于我试图获得文件的在线历史记录,我的方法在这段git log上失败。我看到git实际上向我展示了最好的人类可读的差异,因为编辑后的两行成为一行,但对于脚本来说并不明显。所以,

  • 这是行为的目的? (git 1.9.1)
  • 如果是这样,是否有办法获得关于这些合并的一些额外输出(以及如果存在,unmerges)?它不是,如何以其他方式找到它们?

回答

0

这看起来像--word-diff应该做的。 Git将文件分割为单词(用“”作为分隔符)并显示最小的块。你可以看到你的线条总是在空间上分割。

尝试使用带末端字符的--word-diff-regex=<regex>

关于合并信息:git blame可能是有用的。

+0

http://www.git-scm.com/docs/git-diff –

+0

你的意思是把“[:space:] + \ n”当成一个单词吗?据我所知,\ n被忽略作为一个单词的一部分。 –

+0

我的意思是将“[:space:] + \ n”作为单词分隔符。所以你的文件的字符串将成为git的“单词”。 –