我可以让“git diff”只显示行号和更改的文件名吗?
Posted
技术标签:
【中文标题】我可以让“git diff”只显示行号和更改的文件名吗?【英文标题】:Can I make 'git diff' only display the line numbers AND changed file names? 【发布时间】:2012-04-08 13:16:18 【问题描述】:这个问题需要“行号”。如果您不关心输出中的行号,see this question and answer。
基本上,我不想看到改变的内容,只是文件名和行号。
【问题讨论】:
我很好奇,没有代码的行号真的有用吗?还是要更改行数? 好吧,不是特别的,但我需要它来标记我更改代码的地方。 一种用法是将信息与代码覆盖率报告结合起来,以评估提交中的新代码或修改后的代码是否被测试覆盖 @AntonyG 我在尝试构建一个功能完全相同的实用程序时发现了这个问题(覆盖与更改的行)。您是否设法构建报告?如果有,您是否在任何地方发布过? @AndrewNewdigate 这将是一个很酷的工具,但我从未构建过它。当我遇到这个问题时,我正在做一些其他类型的代码覆盖结果处理,但无法证明实施我的建议所需的时间 【参考方案1】:行号是更改的行数还是包含更改的实际行号?如果您想要更改的行数,请使用git diff --stat
。这会给你一个这样的显示:
[me@somehost:~/newsite:master]> git diff --stat
whatever/views/gallery.py | 8 ++++++++
1 files changed, 8 insertions(+), 0 deletions(-)
无法自行获取更改的行号。
【讨论】:
我在想实际的行号。不过还是谢谢。 我有点怀疑他是否需要一个 GUI 工具。【参考方案2】:注意:如果您只是查找已更改文件的名称(没有行号表示已更改的行),见another answer here。
对此没有内置选项(我认为它也不是很有用),但是在“外部差异”的帮助下 在 Git 中可以做到这一点" 脚本。
这是一个非常糟糕的;您可以按照自己喜欢的方式修复输出。
#! /bin/sh
#
# run this with:
# GIT_EXTERNAL_DIFF=<name of script> git diff ...
#
case $# in
1) "unmerged file $@, can't show you line numbers"; exit 1;;
7) ;;
*) echo "I don't know what to do, help!"; exit 1;;
esac
path=$1
old_file=$2
old_hex=$3
old_mode=$4
new_file=$5
new_hex=$6
new_mode=$7
printf '%s: ' $path
diff $old_file $new_file | grep -v '^[<>-]'
有关“外部差异”的详细信息,请参阅Git manual page 上对GIT_EXTERNAL_DIFF
的描述(大约第 700 行,非常接近结尾)。
【讨论】:
谢谢。在确认没有内置选项之后,我实际上已经编写了一个类似的脚本,:) 管道到| grep -o '^[0-9]*'
只给你数字,假设你不关心右手边。
@DylanYoung 是的;要限制显示的文件,请添加--diff-filter=...
,其中...
部分是您想要查看的更改类型:M
用于修改,A
用于添加,D
用于删除,以及其他根据@987654331 @ 文档。
@Sventies:这不是 OP 所要求的,正如我在答案顶部指出的那样。他不想要文件的名称。他想要名称带有行号。
很公平@torek :)【参考方案3】:
用途:
git diff --name-only
去区分吧!
【讨论】:
这可能是大多数人在查看此页面时正在寻找的答案(这是给我的)。但是,它没有回答原始问题,其中特别提到了行号。 这不应该是公认的答案,因为它只解决了一半的问题——您仍然需要输出哪些行(对于每个文件)发生了更改。 就是这样!我正在寻找这个开关! 为什么不使用“git status”?它还会告诉您未跟踪的文件。 @JimmyPaul 因为有时你已经提交了。例如,您需要列出 master 和当前高级分支之间更改的文件git diff --name-only master..HEAD
【参考方案4】:
在 Windows 上,这会将 Git 输出过滤到文件和更改的行号:
(git diff -p --stat) | findstr "@@ --git"
diff --git a/dir1/dir2/file.cpp b/dir1/dir2/file.cpp
@@ -47,6 +47,7 @@ <some function name>
@@ -97,7 +98,7 @@ <another functon name>
要从中提取文件和更改的行需要更多的工作:
for /f "tokens=3,4* delims=-+ " %f in ('^(git diff -p --stat .^) ^| findstr ^"@@ --git^"') do @echo %f
a/dir1/dir2/file.cpp
47,7
98,7
【讨论】:
【参考方案5】:附带最干净的输出,即仅文件名/路径
git diff-tree --no-commit-id --name-only -r
【讨论】:
【参考方案6】:显示从现在到指定提交之间每个文件中更改的文件名和行数/数量:
git diff --stat <commit-hash>
【讨论】:
【参考方案7】:在git version 2.17.1
上,没有内置标志来实现此目的。
这是一个从统一差异中过滤掉文件名和行号的示例命令:
git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+)2 \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'
例如统一的diff:
$ git diff --unified=0
diff --cc foobar
index b436f31,df63c58..0000000
--- a/foobar
+++ b/foobar
@@@ -1,2 -1,2 +1,6 @@@ Line abov
++<<<<<<< HEAD
+bar
++=======
+ foo
++>>>>>>> Commit message
将导致:
❯ git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+)2 \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'
foobar:1
在常见的grep匹配结果中匹配命令的输出:
$ git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+)2 \+\K[0-9]+(?=(,[0-9]+)? )| @@@.*' | sed -e '0~3s/ @@@[ ]\?//' | sed '2~3 s/$/\n1/g' | sed "N;N;N;s/\n/:/g"
foobar:1:1:Line abov
grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+)2 \+\K[0-9]+(?=(,[0-9]+)? )
:匹配来自diff --cc <filename>
的文件名或匹配来自@@@ <from-file-range> <from-file-range> <to-file-range>
的行号或匹配@@@
之后的剩余文本。
sed -e '0~3s/ @@@[ ]\?//'
:从每 3 行删除 @@@[ ]\?
,以获取 ++<<<<<<< HEAD
之前的可选 1 行上下文。
sed '2~3 s/$/\n1/g'
:在第 2 行和第 3 行之间每 3 行添加 \n1
作为列号。
sed "N;N;N;s/\n/:/g"
:每 3 行加入一个 :
。
【讨论】:
【参考方案8】:1) 我最喜欢的:
git diff --name-status
前置文件状态,例如:
A new_file.txt
M modified_file.txt
D deleted_file.txt
2)如果你想要统计数据,那么:
git diff --stat
将显示如下内容:
new_file.txt | 50 +
modified_file.txt | 100 +-
deleted_file | 40 -
3) 最后,如果你真的只想要文件名:
git diff --name-only
将简单地显示:
new_file.txt
modified_file.txt
deleted_file
【讨论】:
【参考方案9】:用途:
git diff master --compact-summary
输出是:
src/app/components/common/sidebar/toolbar/toolbar.component.html | 2 +-
src/app/components/common/sidebar/toolbar/toolbar.component.scss | 2 --
这正是您所需要的。与从远程提交或拉取新提交时的格式相同。
PS:奇怪的是没人这样回答。
【讨论】:
未指定。它从一年前发布的 2.18 开始工作。 完美。这对我有用,而且反应很完美。【参考方案10】:我使用grep
作为一个幼稚的解决方案。
$ git diff | grep -A2 -- '---'
输出示例:
--- a/fileA.txt
+++ b/fileA.txt
@@ -0,0 +1,132 @@
--
--- a/B/fileC.txt
+++ b/B/fileC.txt
@@ -33663,3 +33663,68800 @@ word_38077.png,Latin
--
--- a/D/fileE.txt
+++ b/D/fileE.txt
@@ -17998,3 +17998,84465 @@ word_23979.png,Latin
--
--- a/F
+++ b/F
@@ -1 +1 @@
也许您可以看到彩色输出。它可以帮助您轻松阅读输出。
【讨论】:
【参考方案11】:尝试使用:
git dif | grep -B <number of before lines to show> <regex>
在我的例子中,我试图搜索我在许多文件中放置调试语句的位置。我需要看看哪个文件已经有了这样的调试语句:
git diff | grep -B 5 dd\(
【讨论】:
以上是关于我可以让“git diff”只显示行号和更改的文件名吗?的主要内容,如果未能解决你的问题,请参考以下文章