개발/개발지식

일일회고 커밋 리스트 스크립트 개발기

핸디(Handy) 2025. 2. 18. 18:51

들어가며

한동안 회사업무와 여러가지 일로 블로깅 하기에 귀찮았다. 하지만 역시 시간이 약이라고 회사업무와 다른일이 바쁘니 또 글을 쓰고 싶어졌다.
글을 쓰려면 항상 소재는 넘친다. 다만 어떤 것을 공유해야할지 모르겠어서 내 일일 회고와 관련된 내용을 쓰면 좋겠다 싶어서 이렇게 작성한다.

이번글에서는 일일 회고를 위한 커밋리스트를 스크립트화해서 하루에 한번씩 혹은 특정날짜의 커밋리스트를 모아오는 과정을 다룬다. 

왜 갑자기 일일회고 스크립트가 필요했는가?

내가 분기회고, 연간회고에 항상 들어가는 말이있는데, "측정할 수 없으면 관리할 수 없고, 관리할 수 없으면 개선할 수 없다" 라는 말이다.

현대 경영학의 아버지로 불리우는 피터 드러커 형님이 하신 말씀인데, 모든 데이터는 측정할수 있는 단위로 관리해야함을 의미한다.

그리고 한국에서 유명한 개발자 중에 삼촌이라고 있다. 이분이 하는 회고 프로세스 중에 분기마다 개발 관련된 내용을 정리해서 사내에 배포하신다고 한다. 

시리즈로 3편있는데 한번씩 봐도 좋을듯한다. 

쨌든 나도 회고를 해야하는데 어떻게 할것이냐 하니 개발자는 코드로 말해야하지 않을까 생각이 들었다.

그래서 생각한 것이 커밋리스트를 하루단위, 일주일, 한달 단위로 정리하면 좋겠구나 라는 생각이 들었다. 

생각이 들면 뭐다? 만들어야지

일일회고 스크립트 개발기

우선 내 상황을 보면, 회사 프로젝트에는 Bit bucket를 사용하고, 개인 프로젝트는 Github를 쓴다. 그래서 커밋을 가져오기 위해 각각의 플랫폼에서 API로 쏴서 가져오는 것은 귀찮았다.

근데 나는 다행히 하나의 컴퓨터만 사용한다. 즉 Bit bucket이든, Github이든 모든 프로젝트는 내 컴퓨터에 있다는 것이고, 또 버전관리 도구로 Git만을 사용하고 있다.

그렇다면 내 맥북에 있는 모든 프로젝트에서 오늘 하루의 깃 리스트를 가져오면 되는게 아닐까 라는 간단한 생각으로 시작했다.

우선 완성된 코드부터 살펴보자.

최종 코드

#!/bin/bash

# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title daliy-commit
# @raycast.mode compact

# Optional parameters:
# @raycast.icon 🤖

#!/bin/bash
# 검색할 기본 디렉터리 목록 (필요에 따라 추가 가능)
SEARCH_DIRS=(~/Desktop/project ~/Documents/toy)
# 최대 탐색 깊이 설정
MAX_DEPTH=3

# 통계 변수
TOTAL_REPOS=0
TOTAL_COMMITS=0

# 출력 리스트 배열 변수
OUTPUT_LINES=()

# 날짜 인자 처리
TARGET_DATE=${1:-$(date +%Y-%m-%d)}

# 저장소 순회 및 커밋 확인 함수
find_git_repos() {
    local base_dir="$1"
    local repos=()

    # .git 디렉터리 찾기
    while IFS= read -r git_dir; do
        repos+=("$git_dir")
    done < <(find "$base_dir" -maxdepth "$MAX_DEPTH" -type d -name ".git")

    for git_dir in "${repos[@]}"; do
        repo_dir=$(dirname "$git_dir")  # .git의 상위 폴더가 실제 프로젝트 폴더
        commit_logs=""

        # Git 저장소인지 확인 후 커밋이 있는 경우만 로그 가져오기
        if cd "$repo_dir" && git rev-parse --is-inside-work-tree &>/dev/null; then
            if git log --oneline &>/dev/null; then
                commit_logs=$(git log --all --since="$TARGET_DATE 00:00:00" --until="$TARGET_DATE 23:59:59" --author="$(git config user.name)" --oneline | sed 's/^/[/; s/ /] /1')
            fi
        fi

        # 커밋 내역이 있으면 저장소 이름과 함께 출력
        if [ -n "$commit_logs" ]; then
            ((TOTAL_REPOS++))
            COMMIT_COUNT=$(echo "$commit_logs" | wc -l)
            ((TOTAL_COMMITS+=COMMIT_COUNT))
            OUTPUT_LINES+=("")
            OUTPUT_LINES+=("📁 Repository: $(basename "$repo_dir")")
            OUTPUT_LINES+=("$commit_logs")
        fi
    done
}

# 설정한 모든 폴더에서 Git 저장소 검색
for dir in "${SEARCH_DIRS[@]}"; do
    if [ -d "$dir" ]; then
        find_git_repos "$dir"
    fi
done

# 요약 출력
OUTPUT_LINES+=("")
OUTPUT_LINES+=("🔍 Summary")
OUTPUT_LINES+=("📂 Total git repositories: $TOTAL_REPOS")
OUTPUT_LINES+=("📝 Total git commits: $TOTAL_COMMITS")
OUTPUT_LINES+=("")

# 출력 리스트 터미널에 출력
printf "%s\n" "${OUTPUT_LINES[@]}"

# 출력 리스트 클립보드 저장 (macOS에서 pbcopy 사용)
printf "%s\n" "${OUTPUT_LINES[@]}" | pbcopy

우선 코드가 긴데, 위에서 읽어오면 주석으로 잘 설명해두어서 어려운 코드는 아니다. 다만 스크립트라서 어색할뿐.

이 스크립트에 대해 설명하자면 SEARCH_DIRS과 MAX_DEPTH에 대한 기준이 필요하다.

우선 내가 원하는 타켓이 되는 폴더를 설정하고 MAX_DEPTH를 기준으로 폴더를 체크했다. 너무 깊어지면 속도 이슈도 있고, node_modules 처럼 뎁스가 들어가면 안될것같아서 정했다.

근데 생각해보니 더 좋은 기준과 방법이 있을것같긴한다. 하지만 내 상황에서 잘 동작하니깐 필요할때 고도화할것이다.

 

결과 확인

이제 이 스크립트를 돌리면 다음처럼 나온다.

해당 스크립트는 뒤에 날짜를 입력하면 해당 날짜의 커밋을 리스트업해주고 아니면 오늘꺼로 리스트업해준다.

그리고 일일회고 서식에 맞춰서 알아서 사용하면 된다.

나의 경우엔 옵시디언에 일일회고를 작성하고 있다. 

캘린더와 일일노트를 기반으로 작성 해당 날짜에 맞춰 업데이트하고 있다.

 

다음 할일

이제 시간이 날때 해당 문서를 일주일, 한달 단위로 읽어서 챗형한테 요약해달라는 기능 + 데스크톱앱을 만들어보는게 다음 일이다.

일일 회고를 넘어 커밋기반 경력관리시스템을 만들어보는게 목표인데, 될라나 모르겠다 ㅋㅋ

끝.