制作git diff --stat显示完整的文件路径

时间:2012-05-05 06:11:59

标签: git git-diff

在执行git diff --stat时,某些文件列出了来自存储库库的完整路径,但有些文件列为:

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

这是路径以...开头,只显示短路径。

我希望git diff列出所有文件的完整文件路径,以便脚本轻松处理。有没有办法让git diff始终显示完整路径

8 个答案:

答案 0 :(得分:88)

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,因为它更像是一个“管道”命令,尽管我怀疑你会很好。请注意,你需要{{1使用--stat时。使用git diff-tree“瓷器”前端和git diff管道命令之间的本质区别在于git diff-tree查找已配置的设置像git diff这样的选项来决定是否进行重命名检测。如果您将提交与索引进行比较,那么加上前端diff.renames将等同于git diff换句话说,git diff-index 读取您的配置自动调用正确的管道。)

答案 1 :(得分:13)

对于Bash用户,您可以使用$COLUMNS变量自动填充可用的终端宽度:

git diff --stat=$COLUMNS

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

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

对于更通用的解决方案,您可以使用tput cols的输出来确定终端宽度。

答案 2 :(得分:12)

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

# 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

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

答案 3 :(得分:0)

有一个选项--name-onlygit diff --name-only。其他git命令(例如showstash)也支持该选项。

该选项不会缩短路径。

答案 4 :(得分:0)

我创建了以下git别名:

diffstat = ! "gitdiffstat() {  git diff --stat=$(tput cols) ${1:-master} ; }; gitdiffstat"

它从tput cols命令中读取列数。默认情况下,它与master进行比较,但是您可以选择指定另一个分支。

$ git diffstat
 .gitalias | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

答案 5 :(得分:0)

我发现一个简单的解决方案是执行此操作:(仅适用于* nix,对不起,没有osx)

<a xlink:href="...">

此版本对两者均适用,但在osx上效果不佳。

git diff --stat=$COLUMNS --relative | head -n -1 | cut -c 2- | xargs -d '\n' -P4 printf "$(pwd)/%s\n"

答案 6 :(得分:0)

git diff 是一个瓷器(用户友好)命令。出于脚本目的,您可能希望使用相应的管道命令 git diff-tree

您可以使用 --name-only-r--no-commit-id 选项的组合,让 git diff-tree 输出相对于 git 存储库的完整路径。

示例

在当前分支的“最后”(HEAD)提交中更改的文件路径。

git diff-tree --name-only -r --no-commit-id HEAD

main 分支上最后一次提交的文件路径

git diff-tree --name-only -r --no-commit-id main

main 分支上最后三个​​提交的文件路径

git diff-tree --name-only -r main main~3

路径src/下最后一次提交的文件路径

git diff-tree --name-only -r --no-commit-id main src/

在当前分支上的最后一次提交中更改的文件的绝对路径

git diff-tree --name-only -r --no-commit-id --line-prefix=`git rev-parse --show-toplevel`/ HEAD

说明

git diff-tree 比较两个 treeish 对象的 blob

提交是一个 treeish 对象,它指向存储库根目录中的对象。目录也是 treeish 对象,而文件是 blobs

运行 git diff-tree HEAD 将比较 HEADHEAD~1 的 blob,并包含存储库根 blob 的差异。要查看不在根目录中的所有更改文件,我们需要进入目录 treeish 对象。这是使用 -r(如递归)选项实现的。

请注意,这允许在任意提交中一两个比较任意目录。

默认情况下,如果只指定了一个 commit 对象,则将其与其父对象进行比较。即,运行 git diff-tree HEAD 等价于 git diff-tree HEAD HEAD~1。如果您只指定一个提交作为 treeish 对象,则显示父提交 ID。使用 --no-commit-id 可以解决这个问题。

git-diff-tree 打印了很多我们不想要的信息(ID、权限、是否是添加、删除、修改)。我们只想要名称,所以我们使用 --name-only

如果我们想要绝对路径,我们需要使用诸如 git rev-parse --show-toplevel 之类的东西作为所有行的前缀。这将获取存储库的绝对路径,不带尾随 /。所以我们添加。

--line-prefix=`git rev-parse --show-toplevel`/

答案 7 :(得分:-1)

我发现diff --stat的行为在git 1.7.10附近发生了变化,以前它会默认将文件路径缩短到固定宽度 - 它现在会显示终端窗口允许的数量。如果您遇到此问题,请确保升级到1.8.0或更高版本。