使用git查找与regex匹配的添加行
我有一个相对较大的功能分支,在其中我添加了很多printf风格的调试(当然还有很多其他的添加) 我想用一种方法找到我添加了使用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
语句的文件
现在我用的是
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'