Bash 프롬프트에서 Git 브랜치 및 상태 표시
인스턴트 Git 컨텍스트를 위한 Bash 프롬프트 커스터마이징
잘 구성된 bash 프롬프트에서 git 저장소 정보 표시는 개발 작업 흐름을 크게 개선할 수 있습니다.
git status 및 git branch 명령을 계속 실행하는 대신, 이러한 중요한 정보를 터미널 프롬프트에 항상 표시할 수 있습니다.

Oh-my-push 프롬프트 예시.
왜 Bash 프롬프트에 Git 정보를 추가해야 할까요?
하루 종일 여러 git 저장소와 브랜치를 사용하는 경우, 컨텍스트 전환은 생산성에 큰 영향을 줄 수 있습니다. git을 인식하는 프롬프트는 여러 일반적인 문제를 해결합니다:
- 브랜치 혼동 방지: 커밋하기 전에 항상 어떤 브랜치에 있는지 알 수 있습니다.
- 명령어 오버헤드 감소:
git status및git branch를 계속 실행할 필요가 없습니다. - 즉시 시각 피드백: 수정되지 않은 변경 사항, 추적되지 않은 파일, 상류 상태를 한눈에 확인할 수 있습니다.
- 오류 감소: 잘못된 브랜치에 커밋하거나 더럽혀진 코드를 푸시하는 실수를 줄일 수 있습니다.
Bash PS1 변수 이해하기
bash 프롬프트는 PS1 환경 변수에 의해 제어됩니다. 이 변수는 다음과 같은 요소를 포함할 수 있습니다:
- 문자열: 표시하고 싶은 문자
- 이스케이프 시퀀스:
\로 시작하는 특별한 코드로 동적 정보를 표시 - 명령어 치환:
$(...)안의 명령어 실행 및 출력 - ANSI 색상 코드: 텍스트 색상을 변경하는 이스케이프 시퀀스
일반적인 PS1 이스케이프 시퀀스는 다음과 같습니다:
\u- 현재 사용자 이름\h- 호스트 이름\w- 현재 작업 디렉토리\$-#은 루트,$은 일반 사용자\t- 24시간 형식의 현재 시간
기본적인 프롬프트는 다음과 같을 수 있습니다: PS1='\u@\h:\w\$ '로 출력은 user@hostname:/path/to/dir$ 처럼 보입니다. bash 기본 사항과 이스케이프 시퀀스에 대한 자세한 내용은 우리의 Bash Cheat Sheet을 참조하세요.
방법 1: Git의 내장 git-prompt.sh 스크립트 사용하기
Git 배포에는 git-prompt.sh라는 도움 스크립트가 포함되어 있으며, 이는 __git_ps1 함수를 제공합니다. 이는 가장 신뢰성 있고 기능이 풍부한 접근 방법입니다.
git-prompt.sh 위치 찾기
먼저 시스템에서 스크립트가 위치하는 곳을 찾습니다:
# Linux에서 일반적인 위치
/usr/share/git-core/contrib/completion/git-prompt.sh
/etc/bashcompletion.d/git-prompt
/usr/lib/git-core/git-sh-prompt
# macOS에서 일반적인 위치 (Homebrew 사용 시)
/usr/local/etc/bashcompletion.d/git-prompt.sh
/Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh
# 필요 시 검색
find /usr -name git-prompt.sh 2>/dev/null
기본 설정
~/.bashrc 또는 ~/.bash_profile에 다음을 추가합니다:
# git-prompt 스크립트를 소스로 가져옵니다
source /usr/lib/git-core/git-sh-prompt
# git 정보를 포함한 프롬프트 설정
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\[\033[01;31m\]$(__git_ps1 " (%s)")\[\033[00m\]\$ '
$(__git_ps1 " (%s)") 부분은 함수를 호출하며, %s는 현재 브랜치 이름으로 대체됩니다. 주변의 공백과 괄호는 잘 정리되어 있습니다.
설정을 편집한 후 구성 파일을 다시 로드합니다:
source ~/.bashrc
git-prompt.sh 고급 옵션
git-prompt.sh는 환경 변수를 통해 선택적 기능을 활성화하면 매우 강력해집니다:
# 수정되지 않은 (*) 및 수정된 (+) 변경 사항 표시
export GIT_PS1_SHOWDIRTYSTATE=1
# 저장된 변경 사항 ($) 표시
export GIT_PS1_SHOWSTASHSTATE=1
# 추적되지 않은 파일 (%) 표시
export GIT_PS1_SHOWUNTRACKEDFILES=1
# HEAD와 상류 간 차이 표시
# 선택지: auto, verbose, name, legacy, git, svn
export GIT_PS1_SHOWUPSTREAM="auto"
# 색상 힌트 활성화 (bash 4.0+ 필요)
export GIT_PS1_SHOWCOLORHINTS=1
# 작업 중 상태 표시
# (MERGING, REBASING, BISECTING, 등)
export GIT_PS1_DESCRIBE_STYLE="default"
이нд케이터의 의미는 다음과 같습니다:
*- 수정되지 않은 변경 사항 (추가되지 않은 수정 파일)+- 수정된 변경 사항 (추가되지만 커밋되지 않은 파일)$- 저장된 변경 사항 존재%- 추적되지 않은 파일 존재<- 상류 브랜치 뒤처짐>- 상류 브랜치 앞서움<>- 상류와 분리됨=- 상류와 동일
완전한 예제 구성
다음은 포괄적인 ~/.bashrc 구성입니다:
# git-prompt 소스
if [ -f /usr/share/git-core/contrib/completion/git-prompt.sh ]; then
source /usr/share/git-core/contrib/completion/git-prompt.sh
fi
# git-prompt 옵션 구성
export GIT_PS1_SHOWDIRTYSTATE=1
export GIT_PS1_SHOWSTASHSTATE=1
export GIT_PS1_SHOWUNTRACKEDFILES=1
export GIT_PS1_SHOWUPSTREAM="auto"
export GIT_PS1_SHOWCOLORHINTS=1
# 색상 정의
COLOR_RESET='\[\033[00m\]'
COLOR_USER='\[\033[01;32m\]' # 녹색
COLOR_PATH='\[\033[01;34m\]' # 파란색
COLOR_GIT='\[\033[01;33m\]' # 노란색
# 프롬프트 설정
PS1="${COLOR_USER}\u@\h${COLOR_RESET}:${COLOR_PATH}\w${COLOR_GIT}"'$(__git_ps1 " (%s)")'"${COLOR_RESET}\$ "
방법 2: 수동 Git 명령어 치환
git-prompt.sh에 접근할 수 없거나 최소한의 솔루션을 원하는 경우, 프롬프트에 직접 git 명령어를 실행할 수 있습니다:
# 간단한 브랜치 이름만 표시
PS1='\u@\h:\w$(git branch 2>/dev/null | grep "^*" | colrm 1 2 | sed "s/^/ (/;s/$/)/")\$ '
# 브랜치 이름과 상태 지시자 표시
parse_git_dirty() {
[[ $(git status 2> /dev/null | tail -n1) != "nothing to commit, working tree clean" ]] && echo "*"
}
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/ (\1$(parse_git_dirty))/"
}
PS1='\u@\h:\w\[\033[01;33m\]$(parse_git_branch)\[\033[00m\]\$ '
이 접근법은 더 이동 가능하지만 git-prompt.sh의 복잡성과 비교하여 느릴 수 있습니다.
방법 3: 현대적인 프롬프트 도구 사용
최소한의 설정으로 풍부한 경험을 원하는 경우, 다음 현대적인 대안을 고려하세요:
Starship 프롬프트
Starship은 Rust로 작성된 빠르고 맞춤화 가능한 프롬프트로, 여러 쉘(bash, zsh, fish, PowerShell)에서 작동합니다.
# Starship 설치
curl -sS https://starship.rs/install.sh | sh
# ~/.bashrc에 추가
eval "$(starship init bash)"
Starship은 자동으로 git 저장소를 감지하고 다음을 표시합니다:
- 브랜치 이름
- 분리된 커밋 해시
- 저장소 상태 (병합, 리베이스 등)
- 수정된 파일 수
- 상류 상태 (앞서움/뒤처짐)
- 그리고 커스터마이즈 가능한 아이콘과 함께 훨씬 더 많은 정보
~/.config/starship.toml을 통해 구성할 수 있습니다:
[git_branch]
symbol = "🌱 "
format = "on [$symbol$branch]($style) "
[git_status]
conflicted = "🏳"
ahead = "⇡${count}"
behind = "⇣${count}"
diverged = "⇕⇡${ahead_count}⇣${behind_count}"
untracked = "🤷"
stashed = "📦"
modified = "📝"
staged = '[++\($count\)](green)'
renamed = "👅"
deleted = "🗑"
Oh My Bash
Oh My Bash는 테마와 플러그인을 사용하여 bash 설정을 관리하는 프레임워크입니다:
# Oh My Bash 설치
bash -c "$(curl -fsSL https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh)"
# ~/.bashrc에서 테마 설정
OSH_THEME="powerline"
Oh My Bash의 많은 테마는 기본적으로 git 통합을 포함합니다.
Oh My Posh
Oh My Posh는 bash, zsh, PowerShell 및 기타 쉘과 호환되는 현대적인, 교차 플랫폼 프롬프트 엔진입니다. 이는 아름다운, 맞춤화 가능한 프롬프트와 우수한 git 통합을 제공하며 Nerd Fonts를 사용하여 아이콘 지원을 제공합니다.
Linux에서 설치
Oh My Posh를 단일 명령어로 설치합니다:
# ~/bin 또는 ~/.local/bin(기본값)에 설치
curl -s https://ohmyposh.dev/install.sh | bash -s
# 또는 사용자 지정 설치 디렉토리 지정
curl -s https://ohmyposh.dev/install.sh | bash -s -- -d ~/bin
기본 설정
~/.bashrc에 Oh My Posh를 추가합니다:
# 테마와 함께 Oh My Posh 초기화
eval "$(oh-my-posh init bash --config ~/.poshthemes/jandedobbeleier.omp.json)"
테마 설치 및 사용
Oh My Posh는 여러 사전 구성된 테마를 포함합니다. 먼저 다운로드해야 합니다:
# 테마 디렉토리 생성
mkdir ~/.poshthemes
# 모든 테마 다운로드
curl -s https://ohmyposh.dev/themes.json | \
jq -r '.[] | .url' | \
xargs -I {} sh -c 'curl -s {} -o ~/.poshthemes/$(basename {})'
인기 있는 테마는 다음과 같습니다:
jandedobbeleer.omp.json- 창작자의 개인 테마로 완전한 git 통합 제공powerline.omp.json- 전통적인 powerline 스타일atomic.omp.json- 필수 정보가 포함된 최소주의night-owl.omp.json- 다양한 git 세부 정보가 포함된 색상 풍부한 테마
테마를 변경하려면 구성 경로를 변경하세요:
eval "$(oh-my-posh init bash --config ~/.poshthemes/atomic.omp.json)"
Git 기능
Oh My Posh는 자동으로 포괄적인 git 정보를 표시합니다:
- 현재 브랜치 이름
- 원격 브랜치에 앞서거나 뒤처진 커밋 수
- 작업 디렉토리 상태 (깨끗/더럽힘)
- 저장 상태 수
- 병합/리베이스 상태
- 태그 정보
- 분리된 HEAD 상태의 커밋 해시
사용자 정의 구성
기존 테마를 복사하여 사용자 정의 테마를 생성하세요:
# 기존 테마를 시작점으로 복사
cp ~/.poshthemes/jandedobbeleer.omp.json ~/.mytheme.omp.json
# 테마 편집
nano ~/.mytheme.omp.json
# 사용자 정의 테마 사용
eval "$(oh-my-posh init bash --config ~/.mytheme.omp.json)"
예시 git 세그먼트 구성:
{
"type": "git",
"style": "powerline",
"powerline_symbol": "",
"foreground": "#193549",
"background": "#fffb38",
"background_templates": [
"{{ if or (.Working.Changed) (.Staging.Changed) }}#FF9248{{ end }}",
"{{ if and (gt .Ahead 0) (gt .Behind 0) }}#ff4500{{ end }}",
"{{ if gt .Ahead 0 }}#B388FF{{ end }}",
"{{ if gt .Behind 0 }}#B388FF{{ end }}"
],
"properties": {
"fetch_status": true,
"fetch_upstream_icon": true,
"branch_icon": " ",
"branch_max_length": 25,
"truncate_symbol": "…"
}
}
폰트 요구 사항
Oh My Posh는 Nerd Fonts를 사용하여 아이콘 지원이 가장 잘 작동합니다:
# Nerd Font 다운로드 및 설치 (예: FiraCode)
mkdir -p ~/.local/share/fonts
cd ~/.local/share/fonts
curl -fLo "FiraCode Nerd Font.ttf" \
https://github.com/ryanoasis/nerd-fonts/raw/HEAD/patched-fonts/FiraCode/Regular/FiraCodeNerdFont-Regular.ttf
fc-cache -fv
그런 다음 터미널을 사용하여 Nerd Font를 구성하세요.
Oh My Posh의 장점
- 교차 플랫폼: Linux, macOS, Windows에서 동일한 구성이 작동
- 빠름: Go로 작성되어 성능 향상
- 확장성: git, 시간, 경로, 언어, 클라우드 제공업체 등 모듈형 세그먼트
- 풍부한 테마: 사전 구성된 테마의 대량 컬렉션
- 활발한 개발: 정기적인 업데이트 및 개선
- 터미널 무관: 모든 ANSI 호환 터미널에서 작동
Bash-git-prompt
git 정보에 집중한 전용 bash 프롬프트 도구:
# 저장소 복제
git clone https://github.com/magicmonty/bash-git-prompt.git ~/.bash-git-prompt --depth=1
# ~/.bashrc에 추가
if [ -f "$HOME/.bash-git-prompt/gitprompt.sh" ]; then
GIT_PROMPT_ONLY_IN_REPO=1
source $HOME/.bash-git-prompt/gitprompt.sh
fi
대규모 저장소에서의 성능 고려 사항
대규모 저장소에서 git 상태 작업은 느릴 수 있습니다. 최적화 전략은 다음과 같습니다:
비용이 많이 드는 기능 선택적으로 비활성화
# .bashrc에서 대규모 저장소에 대해 기능 비활성화
if [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then
repo_size=$(du -sh .git 2>/dev/null | cut -f1)
# 100MB 이상의 저장소에 대해 수정 상태 확인 비활성화
if [[ "$repo_size" =~ ^[0-9]+M$ ]] && [ "${repo_size%M}" -gt 100 ]; then
export GIT_PS1_SHOWDIRTYSTATE=0
fi
fi
git 구성 옵션 사용
상태 확인을 최적화하기 위해 git을 구성하세요:
# 빠른 상태 확인을 위해 파일 시스템 모니터 활성화
git config core.fsmonitor true
git config core.untrackedCache true
# 매우 큰 저장소의 경우 부분 복제 고려
git config core.commitGraph true
git config gc.writeCommitGraph true
대안: 비동기 프롬프트
Starship과 같은 도구는 비동기 작업을 사용하여 프롬프트 지연을 방지합니다. 프롬프트는 git 정보를 가져온 후에 업데이트됩니다.
일반적인 문제 해결
프롬프트가 git 정보를 표시하지 않을 경우
- git-prompt.sh가 소스로 가져왔는지 확인: 터미널에서
type __git_ps1을 실행합니다. “not found"라고 표시되면 스크립트가 로드되지 않았습니다. - 파일 권한 확인: git-prompt.sh가 읽을 수 있도록 합니다:
ls -l /path/to/git-prompt.sh - git 저장소에 있는지 확인:
git status를 실행하여 확인합니다. - PS1 구문 확인:
$(__git_ps1)이 포함되어 있고 올바르게 인용되었는지 확인합니다.
색상이 표시되지 않을 경우
- 이스케이프 시퀀스 문제: PS1의 색상은
\[ \]로 감싸야 하며, 줄 끝 문제를 방지합니다. - 터미널 지원 확인: ANSI 색상 지원 여부를 확인:
echo -e "\033[31mRed Text\033[0m" - 리셋 코드: 항상 색상 시퀀스를 리셋 코드
\033[00m로 끝냅니다.
프롬프트가 줄 끝에 끊길 경우
색상을 사용할 때, 비인쇄 이스케이프 시퀀스는 \[ 및 \]로 감싸야 합니다:
# 잘못된 경우 - 줄 끝 문제 발생
PS1="\033[32m\u\033[00m\$ "
# 올바른 경우
PS1="\[\033[32m\]\u\[\033[00m\]\$ "
WSL 또는 네트워크 드라이브에서 느린 프롬프트
Windows 네트워크 공유 또는 WSL에서 git 작업은 느릴 수 있습니다:
# 느린 파일 시스템에서 비용이 많이 드는 git-prompt 기능 비활성화
export GIT_PS1_SHOWDIRTYSTATE=0
export GIT_PS1_SHOWUNTRACKEDFILES=0
Windows 드라이브에 있는 저장소에 대해 Native Windows Git bash를 사용하는 것이 좋습니다.
개발 작업 흐름과의 통합
git 인식 프롬프트는 다른 쉘 개선 기능과 결합하여 더욱 강력해집니다:
빠른 이동을 위한 Git 앨리어스
강화된 프롬프트와 함께 유용한 git 앨리어스를 결합하여 효율성을 극대화하세요. git 명령어 및 단축키에 대한 포괄적인 목록은 우리의 GIT 명령어 체크리스트를 참조하세요.
# ~/.gitconfig 또는 ~/.bashrc에 추가
alias gs='git status'
alias gb='git branch'
alias gc='git checkout'
alias gp='git pull'
alias gpu='git push'
조건부 프롬프트 행동
# 다양한 상태에 따라 다른 프롬프트 색상 사용
__git_ps1_colorize() {
local git_status="$(git status 2>/dev/null)"
if [[ $git_status =~ "nothing to commit" ]]; then
echo -e "\[\033[32m\]" # 깨끗한 상태는 녹색
else
echo -e "\[\033[31m\]" # 더럽힌 상태는 빨강
fi
}
PS1='\u@\h:\w$(__git_ps1_colorize)$(__git_ps1 " (%s)")\[\033[00m\]\$ '
터미널 제목 표시줄 통합
저장소 정보로 터미널 제목을 업데이트합니다:
PROMPT_COMMAND='echo -ne "\033]0;${PWD##*/}$(__git_ps1 " [%s]")\007"'
최고의 실천 방법 및 권장 사항
- 읽기 쉬운 유지: 너무 많은 정보로 프롬프트를 너무 가득 채우지 마세요
- 색상을 전략적으로 사용: 다양한 상태(깨끗 vs 더럽힘)에 다른 색상을 사용하세요
- 다양한 시나리오에서 테스트: 일반 디렉토리, git 저장소, git 작업 중에서 프롬프트가 작동하는지 확인하세요
- 구성 문서화: .bashrc에 주석을 추가하여 각 부분이 무엇을 하는지 기억하세요
- 구성 백업: git 저장소에 dotfiles을 버전 관리하세요. 자신의 git 서버를 운영 중이라면 Gitea 서버 설치를 탐색하여 가볍고 자체 호스팅 옵션을 고려하세요
- 작업 흐름 고려: 실제로 필요한 기능만 활성화하세요
- 가능한 경우 현대 도구 사용: Starship과 같은 도구는 잘 테스트되고 성능이 좋습니다
자체 호스팅 git 솔루션에 대해 Gitea 백업 및 복구에 대해 학습하여 저장소가 보호되도록 하세요. git 작업 흐름을 자동화하고 싶다면, GitHub Actions 체크리스트를 참조하세요.
유용한 링크
- git-prompt.sh 공식 문서
- Starship 공식 사이트
- Oh My Posh 공식 문서
- Oh My Posh 테마 갤러리
- Bash Hackers Wiki - PS1 구성
- Oh My Bash GitHub 저장소
- Bash-git-prompt GitHub 저장소
- Nerd Fonts 공식 사이트
- ANSI 이스케이프 코드 참고
- 대규모 저장소를 위한 Git 성능 팁