这个问题需要“行号”。如果您不关心输出中的行号,请参阅此问题和答案。
基本上,我不希望看到更改的内容,只希望看到文件名和行号。
这个问题需要“行号”。如果您不关心输出中的行号,请参阅此问题和答案。
基本上,我不希望看到更改的内容,只希望看到文件名和行号。
当前回答
Use:
git diff --name-only
往前走!
其他回答
在git 2.17.1版本中,没有内置标志来实现这一目的。
下面是一个从统一的diff中过滤出文件名和行号的示例命令:
git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'
例如,统一的差异:
$ 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~3{s/ @@@[ ]\?//}' | 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]+)? ): Match filename from diff --cc <filename> OR Match line number from @@@ <from-file-range> <from-file-range> <to-file-range> OR Match remaining text after @@@. sed -e '0~3{s/ @@@[ ]\?//}': Remove @@@[ ]\? from every 3rd line to get the optional 1 line context before ++<<<<<<< HEAD. sed '2~3 s/$/\n1/g': Add \n1 every 3 lines between the 2nd and 3rd line for the column number. sed "N;N;N;s/\n/:/g": Join every 3 lines with a :.
Use:
git diff --name-only
往前走!
注意:如果您只是寻找更改的文件的名称(没有更改的行号),请在这里查看另一个答案。
这方面没有内置选项(我也不认为它有多大用处),但是在Git中,借助“外部diff”脚本可以做到这一点。
这是一个相当糟糕的问题;这将由您来修复输出您想要的方式。
#! /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 '^[<>-]'
关于“external diff”的详细信息,请参见Git手册中GIT_EXTERNAL_DIFF的描述(大约在700行,非常接近结尾)。
试着使用:
git dif | grep -B <number of before lines to show> <regex>
在我的例子中,我试图搜索我在许多文件中放置调试语句的位置。我需要看看哪个文件已经得到了这样的调试语句:
git diff | grep -B 5 dd\(
它并不漂亮,但这里有一句bash:
git diff --unified=0 HEAD~1..HEAD | grep -Po '(^diff --git [a-zA-Z/._]*|^@@.*@@)' | while read l; do if [[ -n ${l##@@*} ]]; then f=${l#*/}; else echo "$f:${l##@@ }" | cut -d' ' -f1 | tr -d '-'; fi; done
解释:
git diff——统一=0头~1..头
从Git中检索提交信息
grep -Po '(^diff——git [a-zA-Z/._]*|^@@.*@@)'
建立在先前的答案上,并筛选到包含 文件名和行号
为了提高可读性,将一行代码扩展为多行代码:
while read line; do
if [[ -n ${line##@@*} ]]; then
# Grabs filename from this pattern: "diff --git a/....."
filename=${line#*/};
else
# Grabs line number from this patterns: "@@ -<line> +<line> @@"
echo"$filename:${line##@@ }" | cut -d' ' -f1 | tr -d '-';
fi;
done
转换为预期输出的字符串解析:
file/name1.txt:34
file/name2.txt:98
file/name2.txt:101
file/name3.txt:2