[IT] Git

[Git] Git Grep 명령으로 소스 검색

오리엔탈킴 2023. 3. 7. 14:48

Git Grep 명령을 이용하여, Git 소스에서 특정 텍스트를 검색하는 것을 정리를 해보려고 합니다.

리눅스의 Grep이나 윈도우의 Find 등 파일을 검색하는 기본적인 기능들이 존재하지만, git 명령어 중에도 grep이라는 명령을 통해 소스 파일 내 텍스트를 검색하는 기능이 있습니다. git pull 이후에 수정된 소스에서 특정 메서드명이나 변수명으로 검색을 해서 변경 사항이나 정책 위반 여부를 판단하는 등의 용도로 간단하게 사용이 가능할 것 같습니다. 다른 파일 검색 기능을 이용해도 되지만, 아주 약간의 소스 특화 기능이 존재하여 git grep을 활용했던 경험을 바탕으로 내용을 정리를 해보려 합니다.

 

git grep

윈도우OS를 기준으로 사용법을 정리를 하면, 아래와 같이 CMD 창에서 해당 .git이 있는 경로로 이동을 하거나 -C 명령을 통해 해당 git이 있는 위치를 지정한 후 grep + 키워드 명령을 통해 검색을 합니다.

git -C git경로 grep 키워드(패턴)
C:\> git -C "C:\dev\resttest" grep "testMethod"

src/main/java/com/example/resttest/config/TestConfig.java: public static String testMethod() { src/main/java/com/example/resttest/dep/service/DepService.java: String str = TestConfig.testMethod(); src/main/java/com/example/resttest/emp/service/EmpService.java: String str = TestConfig.testMethod();

예시로 위와 같이 testMethod라는 키워드를 검색을하면, 예시로 만든 프로젝트에서 총 3개의 검색 결과가 조회되는 것을 확인할 수 있습니다.

 

git grep options

https://git-scm.com/docs/git-grep

위의 사이트에서 여러가지 옵션을 확인이 가능한데요, 그중에 몇 개만 간단하게 정리를 해보려고 합니다.

  • -i : 대소문자 무시
  • -n : 결과에 라인 수 표시
  • -c : 검색 결과에 키워드가 사용된 카운터 표시
  • -w : 단어로 사용된 경우만 조회 (키워드가 aa일 경우, bbaabb와 같이 문자 중간의 키워드는 검색되지 않음)
 # 대소문자를 무시하고 검색하고, 결과에 라인 수도 표시함, 단어인 경우만 검색
git -C "C:\dev\resttest" grep -i -n -w "testmethod"

src/main/java/com/example/resttest/config/TestConfig.java:10: public static String testMethod() { src/main/java/com/example/resttest/dep/service/DepService.java:21: String str = TestConfig.testMethod(); src/main/java/com/example/resttest/emp/service/EmpService.java:22: String str = TestConfig.testMethod();

 

  • -E : 키워드에 extended 정규식 사용 (정규식에 대한 옵션이 없으면 default로 basic 정규식(-G) 사용)
  • -p : 키워드에 perl 정규식 사용
  • -F : 키워드에 정규식 미사용

 

  • -v : 사용이 안된 라인 출력
  • -L : 키워드가 없는 파일의 파일 정보만 표시
  • -l : 결과에 파일 정보만 표시
  • -h : 검색 결과로 출력되는 파일정보를 지움
  • -o : 검색 결과에 키워드만 표시
  • -W : 키워드를 포함하고 있는 함수 전체의 내용을 표시
  • -p : 키워드 라인을 포함하고 있는 함수의 이름을 함께 표시 
 # 검색결과에 파일명은 지우고, 키워드를 포함한 함수 이름을 표시
git -C "C:\dev\resttest" grep -h -p "testMethod"

public class TestConfig {
    public static String testMethod() {
public class DepService {
    String str = TestConfig.testMethod();
public class EmpService {
    String str = TestConfig.testMethod();

 

  • -C [숫자] : 키워드 라인 위아래로 [숫자]줄 만큼 표시
  • -A [숫자] : 키워드 라인 아래로 [숫자]줄 만큼 표시
  • -B [숫자] : 키워드 라인 위로 [숫자]줄 만큼 표시
 # 이전 줄 1줄, 다음 줄 2줄 출력
git -C "C:\dev\resttest" grep -A 2 -B 1 "testMethod"

src/main/java/com/example/resttest/config/TestConfig.java- @Bean src/main/java/com/example/resttest/config/TestConfig.java: public static String testMethod() { src/main/java/com/example/resttest/config/TestConfig.java- return "Test Method"; src/main/java/com/example/resttest/config/TestConfig.java- }
--

 

  • -e : 이 옵션 뒤에 키워드(패턴)를 위치, 생략도 가능하지만 and/or 등에서 명시해줘야 함
  • --and, --or : and 조건과 or 조건으로 조회 시 사용
 # and 조건으로 2개의 키워드를 검색
git -C "C:\dev\resttest" grep -e "testMethod" --and -e "TestConfig"
src/main/java/com/example/resttest/dep/service/DepService.java:        String str = TestConfig.testMethod();

src/main/java/com/example/resttest/emp/service/EmpService.java:        String str = TestConfig.testMethod();

 

  • -- : 옵션의 끝을 알리며, -- 뒤에 검색하고자 하는 파일이나 파일 패스를 지정
 # java 파일을 대상으로 검색
git -C "C:\dev\resttest" grep "testMethod" -- "*.java"

 

  

반응형