让git diff –stat显示完整的文件path

在做的git diff --stat一些文件列出了从库基地的完整path,但一些文件被列为:

 .../short/path/to/filename. 

这是path开始...只显示短path。

我想git diff列出所有文件的完整文件path,以便通过脚本轻松处理。 有什么办法可以让git diff始终显示完整path

git diff命令将采用可选值--stat

 --stat[=<width>[,<name-width>[,<count>]]] Generate a diffstat. You can override the default output width for 80-column terminal by --stat=<width>. The width of the filename part can be controlled by giving another width to it separated by a comma. By giving a third parameter <count>, you can limit the output to the first <count> lines, followed by ... if there are more. These parameters can also be set individually with --stat-width=<width>, --stat-name-width=<name-width> and --stat-count=<count>. 

(对于脚本,你可能想直接使用git diff-tree ,因为它更像是一个“pipe道”命令,尽pipe我怀疑你会没事的。注意,当你使用git diff-tree时候,你需要使用和--stat相同的额外文本git diff-tree 。使用git diff “porcelain”前端和git diff-tree plumbing命令之间的本质区别是, git diff查找diff.renames选项的configuration设置,以决定是否执行重命名检测。 ,如果你比较一个提交与索引,例如,加上前端的git diff会做等价的git diff-index 。换句话说, git diff 读取你的configuration自动调用正确的pipe道

对于脚本处理,最好使用以下方法之一:

 # list just the file names git diff --name-only path/to/modified/file path/to/renamed/file # list the names and change statuses: git diff --name-status M path/to/modified/file R100 path/to/existing/file path/to/renamed/file # list a diffstat-like output (+ed lines, -ed lines, file name): git diff --numstat 1 0 path/to/modified/file 0 0 path/to/{existing => renamed}/file 

当与使用NUL作为字段终止符的-z选项结合使用时,这些方法对于强大的脚本处理变得更加方便。

对于Bash用户,可以使用$COLUMNSvariables自动填充可用的terminal宽度:

 git diff --stat=$COLUMNS 

很长的path名称可能仍会被截断; 在这种情况下,可以使用--stat-graph-width来减小+++ / —部分--stat-graph-width ,例如,将其限制为terminal宽度的1/5:

 git show --stat=$COLUMNS --stat-graph-width=$(($COLUMNS/5)) 

对于更通用的解决scheme,您可以使用输出tput cols的输出来确定terminal宽度。

我发现diff -stat的行为在git 1.7.10的某个地方发生了变化,默认情况下,它会将文件path缩短到一个固定的宽度,现在它显示的就和你的terminal窗口允许的一样多。 如果遇到此问题,请确保升级到1.8.0或更高版本。