Git diff -name-only 带有完整文件路径

8

目前正在使用:

git diff -name-status

现在,这将只会给我以下输出:
README.md
created.txt
test.txt
然而,我正在寻找更像这样的东西:
/User/github/README.md
/User/github/created.txt
/User/github/test.txt
有人知道是否可能实现这样的功能吗?
澄清一下:链接帖子中的评论指出:
所有输出都将返回相对于git rev-parse --show-toplevel的路径,
这正是我想要包含在顶级之前的路径。

可能是重复问题:让git diff --stat显示完整文件路径 - Obsidian Age
如果您尝试在该页面上运行答案,则输出结果与我所解释的不同。我正在寻找Git文件夹之外的系统文件路径,而那个答案似乎只解释了Git文件夹内的文件路径。 - A. Hill
2个回答

17
根据torek的回答,我可以使用--line-prefix标志在一行中实现此操作。
git diff --name-only --line-prefix=`git rev-parse --show-toplevel`/ HEAD release

为什么不使用这个命令?git diff --name-only --line-prefix="${PWD}/" HEAD master - Gi0rgi0s
rev-parse的答案对我很有效。如果你当前在repo根目录下,PWD也可以工作。 - Shawn
1
@Gi0rgi0s PWD是shell的当前目录,因此可靠性要低得多。 - CervEd
虽然已经有一个被接受的答案,但我认为这个回答是在充分利用 git 工具的精神下最好的答案。 - John Rocha

6
只需要自己添加顶层:
git rev-parse --show-toplevel

打印Git存储库的路径。

将差异--name-only输出通过管道传递,例如:sed -e "s,^,$path,"(假设您的路径名称中没有逗号):

git-diff-with-abs-path() {
    local path

    path=$(git rev-parse --show-toplevel) &&
    git diff --name-only "$@" | sed "s,^,$path/,"
}

编辑2:对于--name-status选项,文件名在实际制表符之后,因此:

git-diff-with-abs-path() {
    local path tab=$'\t'

    path=$(git rev-parse --show-toplevel) &&
    git diff --name-status "$@" | sed "s,$tab,$tab$path/,"
}

稍微修饰一下,你可以让它从$ @部分选择 --name-only--name-status并计算正确的sed表达式,而不是硬编码--name-only--name-status

然而,这个命令并不包括添加、修改或删除标签(这些标签在名称状态中显示)。我想我可以将其附加到命令的末尾。但如果有一种方法可以像下面这样做: ' A /User/github/README.md M /User/github/Test.txt ' 那就更理想了。 - A. Hill
没错,这是针对 --name-only 的。要处理 --name-status,请使用一个字面制表符。我会将其编辑到答案中。 - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接