Git笔记(29) 搜索
Git笔记(29) 搜索
- 1. 浏览代码和提交
- 2. Git Grep
- 3. Git 日志搜索
- 4. 行日志搜索
1. 浏览代码和提交
无论仓库里的代码量有多少
经常需要查找一个函数是在哪里调用或者定义的,或者一个方法的变更历史
Git 提供了两个有用的工具来快速地从它的数据库中浏览代码和提交
2. Git Grep
Git 提供了一个 grep
命令,可以很方便地从提交历史或者工作目录中查找一个字符串或者正则表达式
用 Git 本身源代码的查找作为例子
默认情况下 Git 会查找工作目录的文件
可以传入 -n
参数来输出 Git 所找到的匹配行行号
$ git grep -n gmtime_r
compat/gmtime.c:3:#undef gmtime_r
compat/gmtime.c:8: return git_gmtime_r(timep, &result);
compat/gmtime.c:11:struct tm *git_gmtime_r(const time_t *timep, struct tm *result)
compat/gmtime.c:16: ret = gmtime_r(timep, result);
compat/mingw.c:606:struct tm *gmtime_r(const time_t *timep, struct tm *result)
compat/mingw.h:162:struct tm *gmtime_r(const time_t *timep, struct tm *result);
date.c:429: if (gmtime_r(&now, &now_tm))
date.c:492: if (gmtime_r(&time, tm)) {git-compat-util.h:721:struct tm *git_gmtime_r(const time_t *, struct tm *);
git-compat-util.h:723:#define gmtime_r git_gmtime_r
还有一些有趣的选项
例如,可以使用 --count
选项来使 Git 输出概述的信息
仅仅包括哪些文件包含匹配以及每个文件包含了多少个匹配
$ git grep --count gmtime_r
compat/gmtime.c:4
compat/mingw.c:1
compat/mingw.h:1
date.c:2
git-compat-util.h:2
如果想看匹配的行是属于哪一个方法或者函数,可以传入 -p
选项:
$ git grep -p gmtime_r *.c
date.c=static int match_multi_number(unsigned long num, char c, const char *date, char *end, struct tm *tm)
date.c: if (gmtime_r(&now, &now_tm))
date.c=static int match_digit(const char *date, struct tm *tm, int *offset, int *tm_gmt)
date.c: if (gmtime_r(&time, tm)) {
在这里可以看到在 date.c
文件中有 match_multi_number
和 match_digit
两个函数调用了 gmtime_r
还可以使用 --and
标志来查看复杂的字符串组合,也就是在同一行同时包含多个匹配
比如,查看在旧版本 1.8.0 的 Git 代码库中定义了常量名包含 “LINK” 或者 “BUF_MAX” 这两个字符串所在的行
这里也用到了 --break
和 --heading
选项来使输出更加容易阅读
$ git grep --break --heading \-n -e '#define' --and \( -e LINK -e BUF_MAX \) v1.8.0
v1.8.0:builtin/index-pack.c
62:#define FLAG_LINK (1u<<20)v1.8.0:cache.h
73:#define S_IFGITLINK 0160000
74:#define S_ISGITLINK(m) (((m) & S_IFMT) == S_IFGITLINK)v1.8.0:environment.c
54:#define OBJECT_CREATION_MODE OBJECT_CREATION_USES_HARDLINKSv1.8.0:strbuf.c
326:#define STRBUF_MAXLINK (2*PATH_MAX)v1.8.0:symlinks.c
53:#define FL_SYMLINK (1 << 2)v1.8.0:zlib.c
30:/* #define ZLIB_BUF_MAX ((uInt)-1) */
31:#define ZLIB_BUF_MAX ((uInt) 1024 * 1024 * 1024) /* 1GB */
相比于一些常用的搜索命令比如 grep
和 ack
,git grep
命令有一些的优点
第一就是速度非常快
第二是不仅仅可以可以搜索工作目录,还可以搜索任意的 Git 树
在上一个例子中,在一个旧版本的 Git 源代码中查找,而不是当前检出的版本
3. Git 日志搜索
或许不想知道某一项在哪里 ,而是想知道是什么时候存在或者引入的
git log
命令有许多强大的工具可以通过提交信息
甚至是 diff
的内容来找到某个特定的提交
例如,如果想找到 ZLIB_BUF_MAX
常量是什么时候引入的
可以使用 -S
选项来显示新增和删除该字符串的提交
$ git log -SZLIB_BUF_MAX --oneline
e01503b zlib: allow feeding more than 4GB in one go
ef49a7a zlib: zlib can only process 4GB at a time
如果查看这些提交的 diff
可以看到在 ef49a7a
这个提交引入了常量
并且在 e01503b
这个提交中被修改了
如果希望得到更精确的结果,可以使用 -G
选项来使用正则表达式搜索
4. 行日志搜索
行日志搜索是另一个相当高级并且有用的日志搜索功能
在 git log
后加上 -L
选项即可调用,它可以展示代码中一行或者一个函数的历史
例如,假设想查看 zlib.c
文件中 git_deflate_bound
函数的每一次变更
可以执行 git log -L :git_deflate_bound:zlib.c
Git 会尝试找出这个函数的范围,然后查找历史记录
并且显示从函数创建之后一系列变更对应的补丁
$ git log -L :git_deflate_bound:zlib.c
commit ef49a7a0126d64359c974b4b3b71d7ad42ee3bca
Author: Junio C Hamano <gitster@pobox.com>
Date: Fri Jun 10 11:52:15 2011 -0700zlib: zlib can only process 4GB at a timediff --git a/zlib.c b/zlib.c
--- a/zlib.c
+++ b/zlib.c
@@ -85,5 +130,5 @@
-unsigned long git_deflate_bound(z_streamp strm, unsigned long size)
+unsigned long git_deflate_bound(git_zstream *strm, unsigned long size){- return deflateBound(strm, size);
+ return deflateBound(&strm->z, size);}commit 225a6f1068f71723a910e8565db4e252b3ca21fa
Author: Junio C Hamano <gitster@pobox.com>
Date: Fri Jun 10 11:18:17 2011 -0700zlib: wrap deflateBound() toodiff --git a/zlib.c b/zlib.c
--- a/zlib.c
+++ b/zlib.c
@@ -81,0 +85,5 @@
+unsigned long git_deflate_bound(z_streamp strm, unsigned long size)
+{+ return deflateBound(strm, size);
+}
+
如果 Git 无法计算出如何匹配代码中的函数或者方法,可以提供一个正则表达式
例如,这个命令和上面的是等同的:
$ git log -L '/unsigned long git_deflate_bound/',/^}/:zlib.c
也可以提供单行或者一个范围的行号来获得相同的输出
参考: git
以上内容,均根据git官网介绍删减、添加和修改组成
相关推荐:
Git笔记(28) 签署工作
Git笔记(27) 储藏与清理
Git笔记(26) 交互式暂存
Git笔记(25) 选择修订版本
Git笔记(24) 维护项目
谢谢
Git笔记(29) 搜索相关推荐
- Git笔记(34) 调试
Git笔记(34) 调试 1. 文件标注 2. 二分查找 1. 文件标注 如果在追踪代码中的一个 bug,并且想知道是什么时候以及为何会引入 文件标注通常是最好用的工具 它能 显示任何文件中每行最后一 ...
- Git笔记(33) Rerere
Git笔记(33) Rerere 1. 重用记录的解决方案 2. 干净的合并和变基 3. 举例 1. 重用记录的解决方案 git rerere 功能是一个隐藏的功能 正如它的名字"重用记录的 ...
- Git笔记(32) 高级合并
Git笔记(32) 高级合并 1. 合并冲突 1.1. 中断一次合并 1.2. 忽略空白 1.3. 手动文件再合并 1.4. 检出冲突 1.5. 合并日志 1.6. 组合式差异格式 2. 撤消合并 2 ...
- Git笔记(31) 重置揭密
Git笔记(31) 重置揭密 1. 三棵树 1.1. HEAD 1.2. 索引 1.3. 工作目录 2. 工作流程 3. 重置 3.1. 移动 HEAD(--soft) 3.2. 更新索引(--mix ...
- Git笔记(28) 签署工作
Git笔记(28) 签署工作 1. 签署工作 2. GPG 介绍 3. 签署标签 4. 验证标签 5. 签署提交 6. 使用环境 1. 签署工作 Git 虽然是密码级安全的,但它不是万无一失的 如果从 ...
- Git笔记(23) 不同角色的贡献
Git笔记(23) 不同角色的贡献 1. 私有小型团队 2. 私有管理团队 3. 派生的公开项目 4. 通过邮件的公开项目 1. 私有小型团队 可能会遇到的最简单的配置是有一两个开发者的私有(闭源)项 ...
- Git笔记(3) 安装配置
Git笔记(3) 安装配置 1. 安装 Git 1.1. 在 Linux 上安装 1.2. 在 Mac 上安装 1.3. 在 Windows 上安装 2. 初次运行前的配置 2.1. 用户信息 2.2 ...
- Git笔记(6) 查看提交历史
Git笔记(6) 查看提交历史 1. 提交历史 2. 查看 3. 常用选项 3.1. 差异 3.2. 总结 3.3. 自定义格式 3.3.1. 整合一行 3.3.2. 详尽程度 3.3.3. 定制格式 ...
- 【Git笔记2】必知习惯和如何版本回退
良好的习惯会让工作和生活如鱼得水,在使用git的时候有些必知习惯和概念你要get一下,总有些许失误,如:已经提交了不合适的修改到版本库时还没有把自己的本地版本库推送到远程,想要撤销本次提交,或者已经p ...
最新文章
- FPGA设计心得(12)如何正确使用 in_system_ibert ?
- mac下修改mysql默认字符集为utf8
- Ubuntu启动Apache
- 学习进度条——第八周
- java list数组排序_浅谈对象数组或list排序及Collections排序原理
- 某项目要调用现有的100多个DLL 一 开始
- 软件测试管理知识总结
- O2OA办公平台:考勤配置管理手册
- mac pro M1(ARM)安装:VMWare Fusion及linux(centos7/ubuntu)(一)
- linux 流量蠕虫 查杀,linux系统服务器中的蠕虫病毒怎么清除
- 2.证券投资基金的概述
- MongoDB 主从复制(Master-Slaver)实验
- 金丝雀测试实践_金丝雀测试
- Oracle APEX初体验
- Java代码测试大端小端
- CentOS Linux 内核升级
- SOUI总结之控件说明
- 网狐子游戏二人牛牛机器人不起作用的解决办法
- 第三章数据链路层测试题
- wps linux 程序转pdf文件,wps转pdf服务器
热门文章
- [C++] Pure Virtual Function and Abstract Class
- 遍历指定目录并且从子目录开始将目录输出到指定文件
- FG60B SSL ××× V3.0配置
- 当剩下最后一颗×××时,各国军人的表现!
- 10-C++远征之模板篇-学习笔记
- VMware Horizon View 7.5 如何部署虚拟桌面, 专业技术咨询和购买
- 股东痛斥联想管理层:都是帅哥 但业绩差
- 软件测试的含义以及测试的对象
- [Linux] linux服务器主机性能、空间监控脚本
- oracle查询题目2道