使用git查找与regex匹配的添加行

使用git查找与regex匹配的添加行,git,Git,我有一个相对较大的功能分支,在其中我添加了很多printf风格的调试(当然还有很多其他的添加) 我想用一种方法找到我添加了printf语句的文件 现在我用的是 git diff master | grep printf | grep "^+" 这将产生如下输出 + printf("Debug %d\n", i); + printf("Another debug\n"); 然后我可以在我的整个项目中搜索每一行。。。唉 或者我可以使用git log master..HEAD-G printf

我有一个相对较大的功能分支,在其中我添加了很多printf风格的调试(当然还有很多其他的添加)

我想用一种方法找到我添加了
printf
语句的文件

现在我用的是

git diff master | grep printf | grep "^+"
这将产生如下输出

+  printf("Debug %d\n", i);
+  printf("Another debug\n");
然后我可以在我的整个项目中搜索每一行。。。唉

或者我可以使用git log master..HEAD-G printf但是这显示了很多我不需要的额外上下文

我希望有一种方法可以像这样从git获得类似grep的输出:(仅假设)

然后我的编辑会很高兴,我会更有效率


有没有办法给git一个魔法咒语让它做这样的事情?或者是否有其他脚本使其工作?

关于使用git日志的基于git的解决方案,您可以使用
-U
选项减少上下文:

git log master..HEAD -U1 -G printf
即:

-U<n>
--unified=<n>
-U
--统一的=
使用上下文行而不是通常的三行生成差异。暗示-p

我创建了一个bash脚本(在答案的末尾)来做我想做的事情。我将它命名为git find changes matching,使其可执行,并将其固定在我的路径中

现在我可以做了

git find-changes-matching printf master
并得到结果

/some/path/foo.c:65:  printf("Debug %d\n", i);
/someother/path/bar.c:123:  printf("Another debug\n");
注意:它不会做太多错误处理,它的转义可能有点不可靠

注意2:如果您的工作目录脏了,它将给出错误的结果。只要确保一切都已完成

#!/bin/bash

usage () {
    echo "usage:" $@
    exit 127
}

die () {
    echo $@
    exit 128
}

if test $# -ne 2
then
    usage "$0 <regex> <other-branch>"
fi

KEY=$1
MERGEBASE=$(git merge-base HEAD $2)

for x in $(git log ${MERGEBASE}..HEAD -G "${KEY}" --raw | grep "^:" | awk '{ print $6 }' | sort | uniq) ; do
    test -f $x || continue

    while read -r line; do
        if [[ "$line" = "" ]]
        then
            true
        else
            grep -H -n -F "$line" $x
        fi
    done <<< "$(git diff ${MERGEBASE} $x | grep "${KEY}" | grep "^+" | sed "s/^+//")"

done
#/bin/bash
用法(){
回显“用法:”$@
127号出口
}
死(){
回音$@
128号出口
}
如果测试$#-ne 2
然后
用法“$0”
fi
钥匙=1美元
MERGEBASE=$(git合并基头$2)
对于$(git log${MERGEBASE}..HEAD-G“${KEY}”--raw | grep“^:“| awk'{print$6}'| sort | uniq);做
测试-f$x | |继续
而read-r行;做
如果[[“$line”=”“]]
然后
真的
其他的
grep-H-n-F“$line”$x
fi

完成对于类似的事情,我建议不要自动化它

git add -p
将检查您的每项更改,询问您是否要进行阶段性更改

这使您可以再次检查所有更改

编辑此操作应在提交之前完成。现在已经承诺了,就这么做吧

git grep printf 


只搜索c文件

git log master..HEAD-U1-G printf
将为您提供一个简化的上下文,而不仅仅是行。。。因此,在某些情况下,我仍然需要搜索几百行代码才能找到一条printf语句。@MichaelAnderson true,即使是这样,第二条管道也不会找到它。正在删除。这是一个功能分支,而不是一次提交。而
git grep printf
将在所有文件中找到所有
printf
,而不仅仅是我在分支上添加的文件。由于我的分支更改了10000个文件中的大约100个,而这些旧文件中的许多文件使用printfs用于各种用途。。。那是一大堆额外的原油。
git grep printf 
git grep printf -- '*.c'