使git diff--stat显示完整文件路径

使git diff--stat显示完整文件路径,git,git-diff,Git,Git Diff,在执行git diff--stat时,一些文件以存储库库的完整路径列出,但有些文件列为: .../short/path/to/filename. 即路径以…开头,仅显示短路径 我想git diff列出所有文件的完整文件路径,以便脚本轻松处理。是否有某种方法可以让git diff始终显示完整路径默认情况下git diff截断其输出以适合80列终端 您可以通过使用以下命令指定值来覆盖此选项: 请注意,这将生成相对于git存储库根的路径 (对于脚本编写,您可能希望直接使用git diff tre

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

.../short/path/to/filename.  
即路径以
开头,仅显示短路径


我想
git diff
列出所有文件的完整文件路径,以便脚本轻松处理。是否有某种方法可以让
git diff
始终显示完整路径

默认情况下
git diff
截断其输出以适合80列终端

您可以通过使用以下命令指定值来覆盖此选项:

请注意,这将生成相对于git存储库根的路径


(对于脚本编写,您可能希望直接使用
git diff tree
,因为它更像是一个“管道”命令,尽管我怀疑这两种方法都可以。请注意,在使用
git diff tree
时,您需要使用与
git diff
相同的额外文本。使用
git diff
的基本区别在于前端,以及
git diff树
管道命令,是
git diff
查找您配置的选项设置,如
diff.renames
,以决定是否进行重命名检测。如果您比较一个commi,那么,加上前端
git diff
将相当于
git diff索引
换句话说,
git diff
读取您的配置并自动调用正确的管道。)

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

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

git diff --stat=$COLUMNS
很长的路径名仍可能被截断;在这种情况下,您可以使用
--stat graph width
减小+++/-零件的宽度,例如,这将其限制为端子宽度的1/5:

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

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

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

#只列出文件名
git diff--仅限名称
路径/到/修改/文件
路径/到/重命名/文件
#列出名称和更改状态:
git diff——名称状态
M path/to/modified/file
R100路径/到/现有/文件路径/到/重命名/文件
#列出类似diffstat的输出(+ed行,-ed行,文件名):
git diff——numstat
1 0路径/到/修改/文件
0 0路径/to/{existing=>重命名的}/文件

当与
-z
选项结合使用
NUL
作为字段终止符时,它们对于健壮的脚本处理都变得更加方便。

有一个选项
--name only
git diff--name only
。其他git命令也支持该选项,如
show
stash


使用该选项不会缩短路径。

我创建了以下git别名:

diffstat = ! "gitdiffstat() {  git diff --stat=$(tput cols) ${1:-master} ; }; gitdiffstat"
它从
tput cols
命令读取列计数。它默认为与
主节点
进行差分,但您可以选择指定另一个分支

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

我发现一个简单的解决方案是这样做:(只在*nix上工作,抱歉没有osx)

这个版本对两者都适用,但在osx上看起来不太好

git diff --stat=$COLUMNS --relative | sed -e '$ d' | cut -c 2- | xargs -n4 -I{} echo "$(pwd)/{}"

git diff
是一个陶瓷(用户友好)命令。出于编写脚本的目的,您可能需要使用相应的管道命令
git diff tree

您可以使用、和选项的组合获取git diff tree,以输出相对于git存储库的完整路径

例子 在当前分支的“最后一次”(头)提交中更改的文件路径

git-diff-tree--仅名称-r--无提交id头
main
分支上上次提交的文件路径

git-diff-tree--仅名称-r--无提交id main
main
分支上最后三次提交的文件路径

git-diff-tree——仅限名称-r main~3
路径
src/

git diff tree--仅名称-r--无提交id main src/
在当前分支上上次提交时更改的文件的绝对路径

git-diff-tree--仅名称-r--无提交id--行前缀=`git-rev-parse--show toplevel`/HEAD
解释
git diff tree
比较两个treeish对象的blob

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

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

注意,这允许在任意提交中比较任意目录

默认情况下,如果只指定一个提交对象,则将其与其父对象进行比较。即,运行
git-diff-tree-HEAD
相当于
git-diff-tree-HEAD~1
。如果仅将一个提交指定为treeish对象,则会显示父提交id。使用
--no commit id
可以消除此问题

git-diff-tree
打印了许多我们不想要的信息(ID、权限,无论是添加、删除还是修改)。我们只需要名称,所以我们使用
--仅名称

如果我们想
git diff --stat=$COLUMNS --relative | head -n -1 | cut -c 2- | xargs -d '\n' -P4 printf "$(pwd)/%s\n"
git diff --stat=$COLUMNS --relative | sed -e '$ d' | cut -c 2- | xargs -n4 -I{} echo "$(pwd)/{}"