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:externvoid*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:externvoid*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:staticinlinevoid*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)

 

... 译者注: 就是"与"条件搜索和"或"条件搜索可以组合使用.          

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net

上一篇:内存映射区mmap函数


下一篇:OGG 实用案例(三)-linux oracle 同步 windwos oracle