ÖNEMLİ : Kendim için aldığım notlar. Umarım size de bir faydası olur. Kullanılan her bir makale referans olarak eklenmiştir.

Git-Grep Nedir?

Git versiyon kontrol sistemindeki grep komutu bir arama komutudur. Size, yerel ortamınızda “normal ifadeleri” aramak için uygun bir yol sağlar. UNIX kabuğunuzdaki yardımcı programlardan(UNIX Utilities) olan grep ile aynı işleve sahiptir.

git-grep yardımcı programının grep yardımcı programından farkı, git-grep komutunun aramayı sadece git çalışma dizininde gerçekleştiriyor olmasıdır.

Hata Mesajı


Örneğin gelişi güzel bir klasörün içinde arama yapmak istediğimde aşağıdaki gibi bir hata alabilirim.

1
2
xxx-Mac-mini ~ % git grep hasan
fatal: not a git repository (or any of the parent directories): .git

Tabii ki bunun dışında da belli başlı farklar vardır lakin temel amaç olan “searching(arama)” özelliği her ikisinde de aynıdır.

Terminalinize(mac kullanıcıları için) man git-grep yazarak, bu yardımcı programın temel özelliklerini görebilirsiniz.

GIT-GREP(1)                                                                            Git Manual                                                                           GIT-GREP(1)

NAME
       git-grep - Print lines matching a pattern

SYNOPSIS
       git grep [-a | --text] [-I] [--textconv] [-i | --ignore-case] [-w | --word-regexp]
                  [-v | --invert-match] [-h|-H] [--full-name]
                  [-E | --extended-regexp] [-G | --basic-regexp]
                  [-P | --perl-regexp]
                  [-F | --fixed-strings] [-n | --line-number] [--column]
                  [-l | --files-with-matches] [-L | --files-without-match]
                  [(-O | --open-files-in-pager) [<pager>]]
                  [-z | --null]
                  [ -o | --only-matching ] [-c | --count] [--all-match] [-q | --quiet]
                  [--max-depth <depth>] [--[no-]recursive]
                  [--color[=<when>] | --no-color]
                  [--break] [--heading] [-p | --show-function]
                  [-A <post-context>] [-B <pre-context>] [-C <context>]
                  [-W | --function-context]
                  [(-m | --max-count) <num>]
                  [--threads <num>]
                  [-f <file>] [-e] <pattern>
                  [--and|--or|--not|(|)|-e <pattern>...]
                  [--recurse-submodules] [--parent-basename <basename>]
                  [ [--[no-]exclude-standard] [--cached | --no-index | --untracked] | <tree>...]
                  [--] [<pathspec>...]

Git-grep Kullanımı

Varsayılan olarak git-grep komutu, çalışma dizinindeki tüm izlenen dosyalarda(tracked files) istenen ifadeleri arar. Komutun kullanımı kabaca aşağıdaki gibidir. Option kısmına gelebilecek bir sürü şey olduğu için aşağıdaki gibi sade bir kısa formülasyonu tercih ettim.

1
$ git grep [options] [--] [<pathspec>...]

Git-grep çift tire(--) ayırıcısı

Burada dikkat edilecek bir husus, option ile pathspec arasında bulunan çift tire(--) ayırıcısıdır. Diğer Git komutlarında olduğu gibi, çift tire(--), komutu seçeneklerden(options) ayırır. Bir nevi seçeneklerin(options) bittiğini işaret eder. Çift tireden(--) sonra yazılan her şey <pathspec> sınırlayıcısı olarak geçer.. Yani ilgili aramayı options’larda olduğu gibi <pathspec> bazında da sınırlayabilirsiniz. Örneğin;

1
$ git grep hasan -- *.java

gibi bir arama yapmak istediğimde, git klasöründe .java uzantılı dosyalarda “hasan” anahtar kelimesini aramak istediğimi beyan ediyorum. Yani aramayı .java uzantılı dosyalarla sınırlıyorum.

1
git grep 'time' -- '*.[ch]'

Bu örnekte ise, çalışma dizini ve alt dizinlerindeki izlenen(tracked) tüm .c ve .h dosyalarında “time” anahtar kelimesini arar.

Git-grep -p option

-p” seçeneği ise, aranılan kelime grubunu eşleşmesinin gerçekleştiği yöntem veya fonksiyonun başlığını göstermeye çalışır.

Örneğin, github hesabımda arkadaşım görkem’in bir çalışması olan annoconf isimli bir proje üzerinde grep komutunu test edelim istiyorum. Önce “-p” seçeneği olmadan ne gibi bir sonuç alacağımızı görelim.

Aramak istediğim kelime grubu “MemConfig memConfig = config.get(MemConfig.class);

git-grep usage (git-grep kullanımı)
% git grep "MemConfig memConfig = config.get(MemConfig.class);" -- "*.java"
annoconf-examples/src/main/java/com/gorkemgok/annoconf/example/ReloadExample.java:        MemConfig memConfig = config.get(MemConfig.class);

şimdi ise “-p” seçeneği ile aynı komutu çalıştıralım.

% git grep -p "MemConfig memConfig = config.get(MemConfig.class);" -- "*.java"
annoconf-examples/src/main/java/com/gorkemgok/annoconf/example/ReloadExample.java=public class ReloadExample {
annoconf-examples/src/main/java/com/gorkemgok/annoconf/example/ReloadExample.java:        MemConfig memConfig = config.get(MemConfig.class);

Dikkat edileceği üzere, “-p” seçeneğinin olduğu grep sorgusu, ilgili aramanın içinde yer aldığı sınıfın imzasını başlık olarak döndürür.

Git-grep -n option

-n” seçeneği ise, aranan kelime grubunun eşleştiği sonucun bulunduğu satır numarasını, sorgu çıktısına ek olarak verir. Örneğin;

% git grep -n "MemConfig memConfig = config.get(MemConfig.class);" -- "*.java"
annoconf-examples/src/main/java/com/gorkemgok/annoconf/example/ReloadExample.java:19:        MemConfig memConfig = config.get(MemConfig.class);

Dikkat edilecek olursa “java:19:” çıktı ile beraber karşımıza çıkmaktadır. Yalnız bu sonucu “-n” seçeneği kullanmadan da almak mümkündür. Yani “Git grep” komutunu çalıştırırken birkaç seçeneği varsayılan olarak açık olacak şekilde yapılandırmak için standart “git config” komutunu da kullanabilirsiniz. Eğer “git config” ayarları içinde git.lineNumber‘ı true olarak ayarlarsanız, “-n” seçeneğini kullanmadan da aynı sonucu alabilirsiniz.

$ git config grep.lineNumber true

% git grep "MemConfig memConfig = config.get(MemConfig.class);" -- "*.java"
annoconf-examples/src/main/java/com/gorkemgok/annoconf/example/ReloadExample.java:19:        MemConfig memConfig = config.get(MemConfig.class);

Görüleceği üzere sorguda “-n” seçeneği bulunmamaktadır.

Git-grep –or option, –and option

Birden fazla anahtar kelimeyi aynı anda aramak da mümkündür. Bunun için “-or” ve “-and” seçeneklerini kullanabilirsiniz. Yalnız bu boolean operatörlerini kullanmak için 2 tane gerekliliği karşılamanız gerekmektedir. Bunlar;

  • Aranacak ifade çift tırnak “…“ ile sarmalanmalıdır;
  • Diğeri ise her aranacak ifadenin önüne “-e” seçeneğini koymanız gerekmektedir.

Örneğin yukarıdaki sorguya ek olarak, aranacak kelime grubuna “TimeUnit.SECONDS.sleep(2);” ifadesini de ekleyelim istiyorum.

% git grep -e "MemConfig memConfig = config.get(MemConfig.class);" --or -e "TimeUnit.SECONDS.sleep(2);" -- "*.java"
annoconf-examples/src/main/java/com/gorkemgok/annoconf/example/ReloadExample.java:19:        MemConfig memConfig = config.get(MemConfig.class);
annoconf-examples/src/main/java/com/gorkemgok/annoconf/example/ReloadExample.java:27:            TimeUnit.SECONDS.sleep(2);

Bir önceki aramada git.lineNumber‘ı true olarak işaretlediğimiz için “-n” seçeneğini belirtmeksizin ilgili anahtar kelime öbeklerinin bulunduğu satır numaralarını da yazdırdık.

Örneğin iki ifadenin aynı satırda bulunmasını zorunlu kılmak için “–and” seçeneğini kullanabilirsiniz. “-or” seçeneği ise varsayılan seçenektir. Yani “-or” olarak belirtmeden de yukarıdaki sorguyu yazabilirsiniz.

% git grep -e "MemConfig memConfig = config.get(MemConfig.class);" --and -e "TimeUnit.SECONDS.sleep(2);" -- "*.java"

Görüleceği üzere “–and” seçeneğini kullandığımızda ekrana bir sonuç yansımadı. Çünkü grep, aranan bu iki kelime grubunun aynı satırda olmadığı sonucuna vardı.

Git-grep komutunun çalışma dizini(working directory) dışında kullanımı

Şimdiye kadar baktığınız örnekler çalışma dizinini taradı. Örneğin, Git’e HEAD referansında(yani son commit içinde) veya önceki commitlerde arama yapmasını söyleyebilirsiniz.

$ git grep -e "sample" HEAD  -- *.java
$ git grep -e "sample" gh23kpo  -- *.java

Bununla beraber Git’e --cached seçeneğini vasıtasıyla index(staging area)’da arama yapmasını da söyleyebilirsiniz.

git grep -e "sample text" --cached -- '*.txt'

Bu verdiğim örnekler grep kullanımının sadece bir kısmını temsil etmektedir. Dahası için man git-grep komutu vasıtasıyla grep komutunun kullanım kılavuzuna bakmanızı öneririm.

Referanslar