개발 Dev/깃 Git

깃허브 커밋 메시지에서 특정 단어로 검색해서 엑셀 파일로 만들기

Tap to restart 2023. 6. 17. 10:00
반응형

배경

팀 내에서, 코드 리뷰를 통해서 커밋을 한 경우 리뷰어의 이름을 커밋 메시지에 반드시 적기로 했다. 예를 들면 taptorestart란 사람이 리뷰를 했다면 커밋 메시지에 "taptorestart 리뷰 반영"이라고 적기로 한 것이다. 

taptorestart의 리뷰가 반영된 커밋수를 확인하려면 어떻게 해야 할까? 

 

해결방법

git log 명령어로 커밋 메시지에 특정 단어가 들어 있는 커밋을 검색할 수 있다.

예를 들어 git log --grep="flask"라고 검색하면 아래처럼 나오는 것을 볼 수 있다.

 

매번 일일이 이렇게 확인할 수는 없다.

 

위 검색 결과를 엑셀로 만들고 싶다면?

pandas를 활용해서 액셀 파일로 정리해서 만들 수 있다.

 

작업 코드 예다.

import os
import shutil
import re
import pandas as pd


def get_log(username: str, repository: str, pattern: str, start_date: str, end_date: str) -> str:
    repository_path = f"./{repository}"
    if os.path.exists(repository_path):
        shutil.rmtree(repository_path)
    os.system(f"gh repo clone {username}/{repository}")
    filename = f"commit_{repository}.log"
    os.system(
        f"cd {repository}; git log --grep={pattern} --regexp-ignore-case --after={start_date} --before={end_date} --pretty=format:'Hash: %H %nAuthor: %aN %nDate: %aD %nMessage: %s' > ../{filename}")
    return os.getcwd() + "/" + filename


def get_data(repository: str, filepath: str) -> list:
    fp = open(filepath, 'r')
    lines = fp.readlines()
    data = []
    commit = {"repository": repository}
    for line in lines:
        if 'Hash: ' in line:
            commit_hash = re.sub(r'(Hash: | \n)', '', line)
            if commit.get('hash') and commit.get('hash') != commit_hash:
                data.append(commit)
                commit = {"repository": repository}
            commit["hash"] = commit_hash
        elif 'Author: ' in line:
            commit["author"] = re.sub(r'(Author: | \n)', '', line)
        elif 'Date: ' in line:
            commit["date"] = re.sub(r'(Date: | \n)', '', line)
        elif 'Message: ' in line:
            commit["message"] = re.sub(r'(Message: | \n)', '', line)
    data.append(commit)
    return data


if __name__ == '__main__':
    """
    pip install pandas
    pip install openpyxl
    
    gh 설치 및 로그인된 상태에서 실행
    """
    username = "taptorestart"
    repositories = ["python-backend-examples"]  # 작업 저장소 목록 추가
    start_date = "2022-01-01"
    end_date = "2022-12-31"
    data = []
    pattern = "'fastapi\|flask'"  # 검색하고 싶은 단어 추가 or \| 로 표시 예) fastapi 와 flask 검색하고 싶은 경우 fastapi\|flask
    for repository in repositories:
        log_file = get_log(username, repository, pattern, start_date, end_date)
        data += get_data(repository, log_file)
    df = pd.DataFrame(data)
    df.to_excel(f"commit.xlsx")

search_commit.py
0.00MB

위 코드를 실행하면 commit.xlsx 파일이 생성된다.

 

실행 결과 예다.

commit.xlsx
0.01MB

 

반응형