原文:
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
)
...
译者注: 就是"与"条件搜索和"或"条件搜索可以组合使用.
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net