Skip to content

Latest commit

Β 

History

History
229 lines (193 loc) Β· 12.1 KB

File metadata and controls

229 lines (193 loc) Β· 12.1 KB

검색

ν”„λ‘œμ νŠΈκ°€ 크든 μž‘λ“  ν•¨μˆ˜μ˜ μ •μ˜λ‚˜ ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λŠ” 곳을 검색해야 ν•˜λŠ” κ²½μš°κ°€ λ§Žλ‹€. ν•¨μˆ˜μ˜ νžˆμŠ€ν† λ¦¬λ₯Ό 찾아보기도 ν•œλ‹€. Git은 λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯된 μ½”λ“œλ‚˜ μ»€λ°‹μ—μ„œ μ›ν•˜λŠ” 뢀뢄을 λΉ λ₯΄κ³  μ‰½κ²Œ κ²€μƒ‰ν•˜λŠ” 도ꡬ가 μ—¬λŸ¬ κ°€μ§€ 있으며 μ•žμœΌλ‘œ ν•¨κ»˜ μ‚΄νŽ΄λ³΄μž.

Git Grep

Git의 grep λͺ…령을 μ΄μš©ν•˜λ©΄ 컀밋 트리의 λ‚΄μš©μ΄λ‚˜ μ›Œν‚Ή λ””λ ‰ν† λ¦¬μ˜ λ‚΄μš©μ„ λ¬Έμžμ—΄μ΄λ‚˜ μ •κ·œν‘œν˜„μ‹μ„ μ΄μš©ν•΄ μ‰½κ²Œ 찾을 수 μžˆλ‹€. Git μ†ŒμŠ€λ₯Ό 예둜 λ“€μ–΄ λͺ…령을 μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€ μ•Œμ•„λ³΄μž.

기본적으둜 λŒ€μƒμ„ μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ μ›Œν‚Ή λ””λ ‰ν† λ¦¬μ˜ νŒŒμΌμ—μ„œ μ°ΎλŠ”λ‹€. λͺ…령을 μ‹€ν–‰ν•  λ•Œ -n λ˜λŠ” --line-number μ˜΅μ…˜μ„ μΆ”κ°€ν•˜λ©΄ 찾을 λ¬Έμžμ—΄μ΄ μœ„μΉ˜ν•œ 라인 λ²ˆν˜Έλ„ 같이 좜λ ₯ν•œλ‹€.

$ 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:826:struct tm *gmtime_r(const time_t *timep, struct tm *result)
compat/mingw.h:206:struct tm *gmtime_r(const time_t *timep, struct tm *result);
date.c:482:             if (gmtime_r(&now, &now_tm))
date.c:545:             if (gmtime_r(&time, tm)) {
date.c:758:             /* gmtime_r() in match_digit() may have clobbered it */
git-compat-util.h:1138:struct tm *git_gmtime_r(const time_t *, struct tm *);
git-compat-util.h:1140:#define gmtime_r git_gmtime_r

git grep λͺ…λ Ήμ—μ„œ μ“Έλ§Œν•œ λͺ‡ κ°€μ§€ μ˜΅μ…˜μ„ μ’€ 더 μ‚΄νŽ΄λ³΄μž.

예λ₯Ό λ“€μ–΄ μœ„μ˜ κ²°κ³Ό λŒ€μ‹  μ–΄λ–€ νŒŒμΌμ—μ„œ λͺ‡ κ°œλ‚˜ μ°Ύμ•˜λŠ”μ§€λ§Œ μ•Œκ³  μ‹Άλ‹€λ©΄ -c λ˜λŠ” --count μ˜΅μ…˜μ„ μ΄μš©ν•œλ‹€.

$ git grep --count gmtime_r
compat/gmtime.c:4
compat/mingw.c:1
compat/mingw.h:1
date.c:3
git-compat-util.h:2

λ§€μΉ­λ˜λŠ” 라인이 μžˆλŠ” ν•¨μˆ˜λ‚˜ λ©”μ„œλ“œλ₯Ό μ°Ύκ³  μ‹Άλ‹€λ©΄ -p λ˜λŠ” --show-function μ˜΅μ…˜μ„ μ€€λ‹€.

$ git grep -p gmtime_r *.c
date.c=static int match_multi_number(timestamp_t num, char c, const char *date,
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=int parse_date_basic(const char *date, timestamp_t *timestamp, int *offset)
date.c:         /* gmtime_r() in match_digit() may have clobbered it */

gmtime_r ν•¨μˆ˜λ₯Ό date.c νŒŒμΌμ—μ„œ match_multi_number, match_digit ν•¨μˆ˜μ—μ„œ ν˜ΈμΆœν•˜κ³  μžˆλ‹€λŠ” κ±Έ 확인할 수 μžˆλ‹€(μ„Έ 번째둜 ν˜ΈμΆœν•˜λŠ” κ²°κ³ΌλŠ” 주석 μ•ˆμ— μžˆλŠ” 것을 확인할 수 μžˆλ‹€).

--and μ˜΅μ…˜μ„ μ΄μš©ν•΄μ„œ μ—¬λŸ¬ 단어가 ν•œ 라인에 λ™μ‹œμ— λ‚˜νƒ€λ‚˜λŠ” 쀄 μ°ΎκΈ° 같은 λ³΅μž‘ν•œ μ‘°ν•©μœΌλ‘œ 검색할 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ β€œLINK” λ‚˜ β€œBUF_MAX” λ‘˜ 쀑 ν•˜λ‚˜λ₯Ό ν¬ν•¨ν•œ μƒμˆ˜ μ •μ˜λ₯Ό 1.8.0 이전 λ²„μ „μ˜ Git μ†ŒμŠ€ μ½”λ“œμ—μ„œ κ²€μƒ‰ν•˜λŠ” 것을 ν•  수 μžˆλ‹€(--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_HARDLINKS

v1.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 */

git grep λͺ…령은 grep μ΄λ‚˜ ack 같은 일반적인 검색 도ꡬ보닀 λͺ‡ κ°€μ§€ 쒋은 점이 μžˆλ‹€. μš°μ„  맀우 λΉ λ₯΄λ‹€. λ˜ν•œ, μ›Œν‚Ή λ””λ ‰ν† λ¦¬λ§Œμ΄ μ•„λ‹ˆλΌ Git νžˆμŠ€ν† λ¦¬ λ‚΄μ˜ μ–΄λ– ν•œ 정보라도 μ°Ύμ•„λ‚Ό 수 μžˆλ‹€. μœ„μ˜ μ˜ˆμ œμ—μ„œ 이전 λ²„μ „μ˜ μ†ŒμŠ€μ—μ„œλ„ νŠΉμ • 단어λ₯Ό μ°Ύμ•„λ‚Έ 것을 λ³Ό 수 μžˆλ‹€.

Git 둜그 검색

μ–΄λ–€ λ³€μˆ˜κ°€ 어디에 μžˆλŠ”μ§€λ₯Ό μ°Ύμ•„λ³΄λŠ” 게 μ•„λ‹ˆλΌ, νžˆμŠ€ν† λ¦¬μ—μ„œ μ–Έμ œ μΆ”κ°€λ˜κ±°λ‚˜ λ³€κ²½λλŠ”μ§€ μ°Ύμ•„λ³Ό μˆ˜λ„ μžˆλ‹€. git log λͺ…령을 μ΄μš©ν•˜λ©΄ Diff λ‚΄μš©λ„ κ²€μƒ‰ν•˜μ—¬ μ–΄λ–€ μ»€λ°‹μ—μ„œ 찾고자 ν•˜λŠ” λ‚΄μš©μ„ μΆ”κ°€ν–ˆλŠ”μ§€ 찾을 수 μžˆλ‹€.

ZLIB_BUF_MAX λΌλŠ” μƒμˆ˜κ°€ κ°€μž₯ 처음 λ‚˜νƒ€λ‚œ λ•Œλ₯Ό μ°ΎλŠ” 문제라면 -S μ˜΅μ…˜(β€œpickaxe(곑괭이)” μ˜΅μ…˜μ΄λΌ ν•œλ‹€)을 μ΄μš©ν•΄ ν•΄λ‹Ή λ¬Έμžμ—΄μ΄ μΆ”κ°€λœ 컀밋과 μ—†μ–΄μ§„ μ»€λ°‹λ§Œ 검색할 수 μžˆλ‹€.

$ git log -S ZLIB_BUF_MAX --oneline
e01503b zlib: allow feeding more than 4GB in one go
ef49a7a zlib: zlib can only process 4GB at a time

μœ„ 두 μ»€λ°‹μ˜ λ³€κ²½ 사항을 μ‚΄νŽ΄λ³΄λ©΄ ef49a7a μ—μ„œ ZLIB_BUF_MAX μƒμˆ˜κ°€ 처음 λ‚˜μ˜€κ³  e01503b μ—μ„œλŠ” λ³€κ²½λœ 것을 μ•Œ 수 μžˆλ‹€.

더 μ„Έμ„Έν•œ 쑰건을 κ±Έμ–΄ μ°Ύκ³  μ‹Άλ‹€λ©΄ 둜그λ₯Ό 검색할 λ•Œ -G μ˜΅μ…˜μœΌλ‘œ μ •κ·œν‘œν˜„μ‹μ„ μ¨μ„œ κ²€μƒ‰ν•˜λ©΄ λœλ‹€.

라인 둜그 검색

μ§„μ§œ 미친 듯이 쒋은 둜그 검색 도ꡬ가 또 μžˆλ‹€. 라인 νžˆμŠ€ν† λ¦¬ 검색이닀. git log λ₯Ό μ“Έ λ•Œ -L μ˜΅μ…˜μ„ 뢙이면 μ–΄λ–€ ν•¨μˆ˜λ‚˜ ν•œ 라인의 νžˆμŠ€ν† λ¦¬λ₯Ό λ³Ό 수 μžˆλ‹€.

예λ₯Ό λ“€μ–΄, zlib.c νŒŒμΌμ— μžˆλŠ” git_deflate_bound ν•¨μˆ˜μ˜ λͺ¨λ“  λ³€κ²½ 사항듀을 보길 μ›ν•œλ‹€κ³  μƒκ°ν•΄λ³΄μž. git log -L :git_deflate_bound:zlib.c 라고 λͺ…λ Ή μ‹€ν–‰ν•˜λ©΄ λœλ‹€. 이 λͺ…령을 μ‹€ν–‰ν•˜λ©΄ ν•¨μˆ˜μ˜ μ‹œμž‘κ³Ό 끝을 μΈμ‹ν•΄μ„œ ν•¨μˆ˜μ—μ„œ μΌμ–΄λ‚œ λͺ¨λ“  νžˆμŠ€ν† λ¦¬λ₯Ό ν•¨μˆ˜κ°€ 처음 λ§Œλ“€μ–΄μ§„ λ•ŒλΆ€ν„° Patchλ₯Ό λ‚˜μ—΄ν•˜μ—¬ 보여쀀닀.

$ 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 -0700

    zlib: zlib can only process 4GB at a time

diff --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 -0700

    zlib: wrap deflateBound() too

diff --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 λͺ…λ ΉμœΌλ‘œ μœ„μ™€ 같은 κ²°κ³Όλ₯Ό λ³Ό 수 μžˆλ‹€. ν•œ 라인의 νžˆμŠ€ν† λ¦¬λ§Œ 검색할 μˆ˜λ„ 있고 μ—¬λŸ¬ 라인에 걸친 νžˆμŠ€ν† λ¦¬λ₯Ό 검색할 μˆ˜λ„ μžˆλ‹€.