原文:
http://gitbook.liuhui998.com/4_8.html
使用Git Grep进行搜索
用git grep 命令查找Git库里面的某段文字是很方便的. 当然, 你也可以用unix下的'grep'命令进行搜索, 但是'git grep'命令能让你不用签出(checkout)历史文件, 就能查找它们.
例如, 你要看 git.git 这个仓库里每个使用'xmmap'函数的地方, 你可以运行下面的命令:
$ git grep xmmapconfig . 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 flaread - 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 , fsha1_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 xmmapconfig . 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 , intread - 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 , fdsha1_file . c : 780 : win -> base = xmmap ( NULL , win -> len ,sha1_file . c : 1076 : map = xmmap ( NULL , * size , PROT_READ , MAP_PRsha1_file . c : 2393 : buf = xmmap ( NULL , size , PROT_READ , MAP_PRIVATE , fdwrapper . c : 89 : void * xmmap ( void * start , size_t length ,
如果我们想只显示文件名, 我们可以使用'--name-onley'选项:
$ > git grep -- name - only xmmapconfig . cdiff . cgit - compat - util . hread - cache . crefs . csha1_file . cwrapper . c
我们可以用'-c'选项,可以查看每个文件里有多少行匹配内容(line matches):
$ > git grep - c xmmapconfig . c : 1diff . c : 1git - compat - util . h : 1read - cache . c : 1refs . c : 1sha1 _file . c : 5wrapper . c : 1
现在, 如果我们要查找git仓库里某个特定版本里的内容, 我们可以像下面一样在命令行末尾加上标签名(tag reference):
$ git grep xmmap v1 . 5.0v1.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 , logfdv1 . 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 , fdv1 . 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_DIRENTbuiltin - fsck . c : #define SORT_DIRENT 0builtin - fsck . c : #define SORT_DIRENT 1
我不但可以进行“与"(both)条件搜索操作,也可以进行"或"(either)条件搜索操作.
$ git grep -- all - match - e '#define' - e SORT_DIRENTbuiltin - fsck . c : #define REACHABLE 0x0001builtin - fsck . c : #define SEEN 0x0002builtin - fsck . c : #define ERROR_OBJECT 01builtin - fsck . c : #define ERROR_REACHABLE 02builtin - fsck . c : #define SORT_DIRENT 0builtin - fsck . c : #define DIRENT_SORT_HINT ( de ) 0builtin - fsck . c : #define SORT_DIRENT 1builtin - 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 5builtin - blame . c : #define MORE_THAN_ONE_PATH ( 1u << 13 )builtin - blame . c : #define MAXSG 16builtin - describe . c : #define MAX_TAGS ( FLAG_BITS - 1 )builtin - fetch - pack . c : #define MAX_IN_VAIN 256builtin - fsck . c : #define MAX_SHA1_ENTRIES ( 1024 )
...
译者注: 就是"与"条件搜索和"或"条件搜索可以组合使用.