Git diff输出只有文件名。

3

我正在Bash窗口使用git diff命令对标签进行比较,它大致上做的是我想要的。

$ git diff -- numstat TAG2 TAG1

提供以下输出:
4  6  dir1/dir2/dir3/dir4/thisIsMyFile.cs

我该如何获得这个输出:

4  6  thisIsMyFile.cs

我不需要/想要路径(dir1/dir2/dir3/dir4/),只需要文件名(thisIsMyFile.cs)。


忘记添加的是,由于在TAG上进行了差异比较,会发现许多文件的路径中包含不同的目录。无论如何,我仍然只想要文件名。获取以下内容: 4 6 dir1/dir2/dir3/dir4/thisIsMyFile1.cs 22 12 dir1/dir2/thisIsMyFile2.cs 8 2 dir1/thisIsMyFile3.cs期望得到: 4 6 thisIsMyFile1.cs 22 12 thisIsMyFile2.cs 8 2 thisIsMyFile3.cs - user8644501
3个回答

2
据我所知,仅使用Git(即只是给予Git diff正确的参数)无法完成这个任务。您需要使用Bash管道来对Git输出进行后处理。我建议采用以下方法:
git diff --numstat TAG2 TAG1 | while IFS= read -r line; do
    printf '%s\t' "$(cut -f-2 <<<"$line")"
    basename "$(cut -f2- <<<"$line")"
done

这个任务稍微有点复杂,因为它旨在保留原始格式并且即使有带制表符或空格的文件也能正确解析。如果你可以保证没有任何文件名中会出现空格等空白字符,或者你想使用比Bash更强大的脚本语言来解析行,则可以简化此任务。


1
你可以使用 awk:
git diff --numstat | awk -F'[/\t]' '{print $1,$2,$NF}'

awk 命令是做什么的?

-F'[/\t]'字段分隔符设置为制表符或/。(git 的输出是以制表符分隔的)。$NF 是行中的最后一个字段 - 文件名。


注意:如果文件名包含制表符,则上述命令将失败。如果您可以接受这个限制,请享受!

0

使用basename -a $(git diff --numstat TAG1 TAG2)

注意:我正在使用bash语法来执行子命令。


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