git grep简介

原文:  http://gitbook.liuhui998.com/4_8.html
使用Git Grep进行搜索

用git grep 命令查找Git库里面的某段文字是很方便的. 当然, 你也可以用unix下的'grep'命令进行搜索, 但是'git grep'命令能让你不用签出(checkout)历史文件, 就能查找它们.

例如, 你要看 git.git 这个仓库里每个使用'xmmap'函数的地方, 你可以运行下面的命令:

$ git grep xmmap
config . c :               contents = xmmap ( NULL , contents_sz , PROT_READ ,
diff . c :         s -> data = xmmap ( NULL , s -> size , PROT_READ , MAP_PRIVATE , fd , 0 );
git - compat - util . h : extern void * xmmap ( void * start , size_t length , int prot , int fla
read - cache . c :   mmap = xmmap ( NULL , mmap_size , PROT_READ | PROT_WRITE , MAP_PRIVATE ,
refs . c : log_mapped = xmmap ( NULL , mapsz , PROT_READ , MAP_PRIVATE , logfd , 0 );
sha1_file . c :    map = xmmap ( NULL , mapsz , PROT_READ , MAP_PRIVATE , fd , 0 );
sha1_file . c :    idx_map = xmmap ( NULL , idx_size , PROT_READ , MAP_PRIVATE , fd , 0 );
sha1_file . c :                    win -> base = xmmap ( NULL , win -> len ,
sha1_file . c :                    map = xmmap ( NULL , * size , PROT_READ , MAP_PRIVATE , f
sha1_file . c :            buf = xmmap ( NULL , size , PROT_READ , MAP_PRIVATE , fd , 0 );
wrapper . c : void * xmmap ( void * start , size_t length ,

如果你要显示行号, 你可以添加'-n'选项:

$ > git grep - n xmmap
config . c : 1016 :          contents = xmmap ( NULL , contents_sz , PROT_READ ,
diff . c : 1833 :            s -> data = xmmap ( NULL , s -> size , PROT_READ , MAP_PRIVATE , fd ,
git - compat - util . h : 291 : extern void * xmmap ( void * start , size_t length , int prot , int
read - cache . c : 1178 :      mmap = xmmap ( NULL , mmap_size , PROT_READ | PROT_WRITE , MAP_
refs . c : 1345 :    log_mapped = xmmap ( NULL , mapsz , PROT_READ , MAP_PRIVATE , logfd , 0 );
sha1_file . c : 377 :        map = xmmap ( NULL , mapsz , PROT_READ , MAP_PRIVATE , fd , 0 );
sha1_file . c : 479 :        idx_map = xmmap ( NULL , idx_size , PROT_READ , MAP_PRIVATE , fd
sha1_file . c : 780 :                        win -> base = xmmap ( NULL , win -> len ,
sha1_file . c : 1076 :                       map = xmmap ( NULL , * size , PROT_READ , MAP_PR
sha1_file . c : 2393 :               buf = xmmap ( NULL , size , PROT_READ , MAP_PRIVATE , fd
wrapper . c : 89 : void * xmmap ( void * start , size_t length ,

如果我们想只显示文件名, 我们可以使用'--name-onley'选项:

$ > git grep -- name - only xmmap
config . c
diff . c
git - compat - util . h
read - cache . c
refs . c
sha1_file . c
wrapper . c

我们可以用'-c'选项,可以查看每个文件里有多少行匹配内容(line matches):

$ > git grep - c xmmap
config . c : 1
diff . c : 1
git - compat - util . h : 1
read - cache . c : 1
refs . c : 1
sha1 _file . c : 5
wrapper . c : 1

现在, 如果我们要查找git仓库里某个特定版本里的内容, 我们可以像下面一样在命令行末尾加上标签名(tag reference):

$ git grep xmmap v1 . 5.0
v1.5 . 0 : config . c :                contents = xmmap ( NULL , st . st_size , PROT_READ ,
v1 . 5.0 : diff . c :          s -> data = xmmap ( NULL , s -> size , PROT_READ , MAP_PRIVATE , fd ,
v1 . 5.0 : git - compat - util . h : static inline void * xmmap ( void * start , size_t length ,
v1 . 5.0 : read - cache . c :                    cache_mmap = xmmap ( NULL , cache_mmap_size ,  
v1 . 5.0 : refs . c :  log_mapped = xmmap ( NULL , st . st_size , PROT_READ , MAP_PRIVATE , logfd
v1 . 5.0 : sha1_file . c :     map = xmmap ( NULL , st . st_size , PROT_READ , MAP_PRIVATE , fd ,  
v1 . 5.0 : sha1_file . c :     idx_map = xmmap ( NULL , idx_size , PROT_READ , MAP_PRIVATE , fd
v1 . 5.0 : sha1_file . c :                     win -> base = xmmap ( NULL , win -> len ,
v1 . 5.0 : sha1_file . c :     map = xmmap ( NULL , st . st_size , PROT_READ , MAP_PRIVATE , fd ,  
v1 . 5.0 : sha1_file . c :             buf = xmmap ( NULL , size , PROT_READ , MAP_PRIVATE , fd

我可以看到"1.5.0版"和当前版本间一些区别: 在“1.5.0版"中, xmmap没有在wrapper.c中出现.

我们也可以组合一些搜索条件, 下面的命令就是查找我们在仓库的哪个地方定义了'SORT_DIRENT'.

$ git grep - e '#define' -- and - e SORT_DIRENT
builtin - fsck . c : #define SORT_DIRENT 0
builtin - fsck . c : #define SORT_DIRENT 1

我不但可以进行“与"(both)条件搜索操作,也可以进行"或"(either)条件搜索操作.

$ git grep -- all - match - e '#define' - e SORT_DIRENT
builtin - fsck . c : #define REACHABLE 0x0001
builtin - fsck . c : #define SEEN       0x0002
builtin - fsck . c : #define ERROR_OBJECT 01
builtin - fsck . c : #define ERROR_REACHABLE 02
builtin - fsck . c : #define SORT_DIRENT 0
builtin - fsck . c : #define DIRENT_SORT_HINT ( de ) 0
builtin - fsck . c : #define SORT_DIRENT 1
builtin - fsck . c : #define DIRENT_SORT_HINT ( de ) (( de )-> d_ino )
builtin - fsck . c : #define MAX_SHA1_ENTRIES ( 1024 )
builtin - fsck . c : if ( SORT_DIRENT )

我们也可以查找出符合一个条件(term)且符合两个条件(terms)之一的文件行. 例如我们要找出名字中含有‘PATH'或是'MAX'的常量定义:

$ git grep - e '#define' -- and \( - e PATH - e MAX \) 
abspath . c : #define MAXDEPTH 5
builtin - blame . c : #define MORE_THAN_ONE_PATH       ( 1u << 13 )
builtin - blame . c : #define MAXSG 16
builtin - describe . c : #define MAX_TAGS     ( FLAG_BITS - 1 )
builtin - fetch - pack . c : #define MAX_IN_VAIN 256
builtin - fsck . c : #define MAX_SHA1_ENTRIES ( 1024 )

...
译者注: 就是"与"条件搜索和"或"条件搜索可以组合使用.
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值