제임스딘딘의
Tech & Life

개발자의 기록 노트/Linux

shell prompt에 git branch 이름 표시 / 색상으로 status 표시

제임스-딘딘 2017. 11. 23. 01:10

git 기본 사용시 불편한 점

여러 소스코드 형상관리 툴 중 git을 주로 사용하는데, linux shell prompt에서 사용하다 보면, 불편한 경우가 있다.

아래 두가지 경우였다.


1. 현재 git directory의 branch가 어디인지?

2. 현재 git directory의 변경사항이 있는지?


기본 상태에서...

1번의 경우는, 'git branch' 라고 명령을 입력해야 확인 가능하다.

2번의 경우는 'git status' 라고 명령을 입력해야 확인 가능하다.


이게 은근 귀찮다.

그래서 shell prompt에서 git directory로 진입을 하면 branch명을 표시하고, 해당 branch명을 다시 status에 따라 녹색/빨간색으로 표시하도록 하고자 한다.



.bashrc 파일 수정


HOME directory의 '.bashrc' 파일에 몇가지 추가 및 수정을 하면 된다.
c_cyan=`tput setaf 6`
c_red=`tput setaf 1`
c_green=`tput setaf 2`
c_sgr0=`tput sgr0`

parse_git_branch ()
{
   if git rev-parse --git-dir >/dev/null 2>&1
   then
      gitver=$(git branch 2>/dev/null| sed -n '/^\*/s/^\* //p')
   else
      return 0
   fi
   echo -e $gitver
}

branch_color ()
{
   if git rev-parse --git-dir >/dev/null 2>&1
   then
      color=""
      if git diff --quiet 2>/dev/null >&2
      then
         color="${c_green}"
      else
         color=${c_red}
      fi
   else
      return 0
   fi
   echo -ne $color
}

.... 중략 ....

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
#    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\[${c_sgr0}\] (\[$(branch_color)\]$(parse_git_branch)\[${c_sgr0}\])\$ '
fi



붉게 표시한 부분이 실제 shell prompt에 git branch 이름과 색상을 결정하고 표시하는 부분이다.


branch_color( ), parse_git_branch( ) 는 새로 추가한 함수이다. 

c_cyan, c_red, c_green, c_sgr0 는 새로 추가한 변수이고, 색상을 결정한다.


작업하면서 헷갈릴 수 있는데, PS1가 shell prompt에 표시되는 내용을 결정한다.


\u : 사용자명 

\h : 호스트명

\W : 현재 디랙토리

\w : 현재 경로


이렇게 나타내게 된다. 이외에도 있을 것 같은데, 나는 더이상 필요없어서 알아보진 않았다. 각자 자신의 입맛에 맛게 수정하면 될 것 같다.

PS1에서 branch_color와 parse_git_branch함수를 호출하도록 하여, git 저장소를 사용하는 디렉토리이면 현재의 브랜치명을 표시하고, 수정내용이 있으면 빨간색으로 표시하며 그외에는 녹색으로 표시하도록 하는 내용 이다.


수정 한 뒤, 적용이 잘 되었는지 확인하려면, terminal을 닫은 후 다시 실행 하던가, 아래 커맨드로 .bashrc의 변경된 내용을 현재 terminal에 적용하면 된다.


source ~/.bashrc


적용된 모습

적용 되면 아래와 같이 동작한다.



아무런 수정사항이 없는 경우, 녹색으로 branch 이름이 표시된다.



뭔가 diff가 있는 경우, 빨간색으로 branch 이름이 표시된다.