在执行git diff --stat
某些文件时,列出了来自存储库库的完整路径,但有些文件列出为:
.../short/path/to/filename.
那就是路径开始,...
并且只显示短路径。
我想git diff
列出所有文件的完整文件路径,以便脚本轻松处理。有什么方法可以让我git diff
始终显示完整路径
默认情况下git diff
会截断其输出以适应 80 列终端。
您可以通过使用--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 --stat=10000
请注意,这会产生相对于 git 存储库根目录的路径。
(对于脚本,您可能希望直接使用它,因为它更像是一个“管道”命令,尽管我怀疑无论哪种方式都可以。请注意,使用时git diff-tree
您需要相同的额外文本。使用“瓷器”之间的本质区别" 前端和管道命令是查找您配置的设置以获取选项,例如决定是否进行重命名检测。好吧,加上前端将相当于您将提交与索引进行比较,例如。换句话说,读取您的配置并自动调用正确的管道。)--stat
git diff-tree
git diff
git diff-tree
git diff
diff.renames
git diff
git diff-index
git diff
对于脚本处理,最好使用以下方法之一:
# 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
对于 Bash 用户,您可以使用该$COLUMNS
变量来自动填充可用的终端宽度:
git diff --stat=$COLUMNS
很长的路径名可能仍会被截断;在这种情况下,您可以使用 减小 +++/--- 部分的宽度--stat-graph-width
,例如,这会将其限制为终端宽度的 1/5:
git show --stat=$COLUMNS --stat-graph-width=$(($COLUMNS/5))
对于更通用的解决方案,您可以使用 的输出tput cols
来确定终端宽度。
有一个选项--name-only
:git diff --name-only
。show
其他 git 命令(如和)也支持该选项stash
。
该选项不会缩短路径。
我发现一个简单的解决方案是这样做:(仅适用于 *nix,抱歉没有 osx)
git diff --stat=$COLUMNS --relative | head -n -1 | cut -c 2- | xargs -d '\n' -P4 printf "$(pwd)/%s\n"
此版本适用于两者,但在 osx 上看起来不太好。
git diff --stat=$COLUMNS --relative | sed -e '$ d' | cut -c 2- | xargs -n4 -I{} echo "$(pwd)/{}"
我创建了以下 git 别名:
diffstat = ! "gitdiffstat() { git diff --stat=$(tput cols) ${1:-master} ; }; gitdiffstat"
tput cols
它从命令中读取列数。它默认为 diffing against master
,但您可以选择指定另一个分支。
$ git diffstat
.gitalias | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
git diff
是一个瓷器(用户友好的)命令。出于脚本目的,您可能希望使用相应的管道命令git diff-tree
。
您可以使用和选项的git diff-tree
组合输出相对于 git 存储库的完整路径。--name-only
-r
--no-commit-id
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
path 下最后一次提交的文件的路径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
比较两个树状对象的blob 。
提交是一个treeish
对象,它指向存储库根中的对象。目录也是treeish
对象,而文件是blobs
.
运行git diff-tree HEAD
将比较 和 的 blobHEAD
并HEAD~1
包含存储库根的 blob 的差异。要查看所有不在根目录中的已更改文件,我们需要深入到目录treeish
对象中。这是使用-r
(如递归)选项实现的。
请注意,这允许在任意提交中一二比较任意目录。
默认情况下,如果只指定了一个提交对象,则将其与其父对象进行比较。即,运行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`/
我发现 diff --stat 的行为在 git 1.7.10 附近的某个地方发生了变化,以前它默认将文件路径缩短到固定宽度 - 现在它显示的内容与终端窗口允许的一样多。如果您遇到此问题,请确保升级到 1.8.0 或更高版本。