使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)/{}"