요새 모든 소스 코드의 관리에 여기저기서 마구 언급되고 있는 Git를 익혀서 쓰려고 노력하고 있는 중이다. 그런데, git repository browser인 gitk와의 첫 대면은 결코 좋은 인상이 아니었다. Mac에 설치되어 있는 gitk의 User Interface는 TCL/TK 위에서 실행되는 놈이라서 그런지, 아무리 글꼴을 바꾸고 꾸며봐도 영 Mac OS X의 Inteface와 맞지를 않았다.

그래서, 대체할 놈을 찾아보니, 대표적으로 두 놈을 만났다. 바로 GitNubGitX. 우선 인터페이스를 비교해보면, 두 놈 다 코코아 어플리케이션이라 GitK보다 산뜻한 느낌이고 UI 측면에서 GitX가 더 편안한 느낌이 들었으며, RubyCocoa로 짠 GitNub에 비해서 GitX는 순 코코아 프로그램이라 설치도 싶다.



참고로, 아래는 gitx를 위한 alias를 추가하면서 살펴본 .bash_login 파일에 있는 Git 관련 설정:

#########
#  Git  #
#########
# Show Git dirty state (and branch) in the prompt
        RED="\[\033[0;31m\]"
     YELLOW="\[\033[0;33m\]"
     GREEN="\[\033[0;32m\]"
       BLUE="\[\033[0;34m\]"
  LIGHT_RED="\[\033[1;31m\]"
LIGHT_GREEN="\[\033[1;32m\]"
      WHITE="\[\033[1;37m\]"
 LIGHT_GRAY="\[\033[0;37m\]"
 COLOR_NONE="\[\e[0m\]"
 
function parse_git_branch() {
  git rev-parse --git-dir &> /dev/null
  git_status="$(git status 2> /dev/null)"
  branch_pattern="^# On branch ([^${IFS}]*)"
  remote_pattern="# Your branch is (.*) of"
  diverge_pattern="# Your branch and (.*) have diverged"
  if [[ ! ${git_status}} =~ "working directory clean" ]]; then
    state="${RED}"
  fi
  # add an else if or two here if you want to get more specific
  if [[ ${git_status} =~ ${remote_pattern} ]]; then
    if [[ ${BASH_REMATCH[1]} == "ahead" ]]; then
      remote="${YELLOW}"
    else
      remote="${YELLOW}"
    fi
  fi
  if [[ ${git_status} =~ ${diverge_pattern} ]]; then
    remote="${YELLOW}"
  fi
  if [[ ${git_status} =~ ${branch_pattern} ]]; then
    branch=${BASH_REMATCH[1]}
    echo " (${branch})${remote}${state}"
  fi
}
 
function prompt_func() {
    previous_return_value=$?;
    prompt="${TITLEBAR}${BLUE}[${RED}\w${GREEN}$(parse_git_branch)${BLUE}]${COLOR_NONE} "
    if test $previous_return_value -eq 0
    then
        PS1="${prompt}"
    else
        PS1="${prompt}${RED}${COLOR_NONE} "
    fi
}
 
PROMPT_COMMAND=prompt_func

source ~/.git-completion.sh

# aliases
alias gb='git branch'
alias gba='git branch -a'
alias go='git checkout'
alias gcb='git checkout -b'
alias gd='git diff | mate' # show the diff in TextMate
alias gc='git commit -v'
alias gca='git commit -v -a'
alias gcm='git commit -a -m'
# commit pending changes and quote all args as message
function gg() {
  git commit -v -a -m "$*"
}
alias gst='git status'
alias glg='git log --pretty=format:"%h %ad | %s%d [%an]" --graph --date=short'
alias gp='git push'
alias gl='git pull'
alias gk='gitk --all &' # open gitk in background
alias gx='gitx' # open much prettier gitk clone GitX
alias gt='git tag -a' # create an unsigned tag
# http://notes.envato.com/developers/rebasing-merge-commits-in-git/
function git_current_branch() {
  git symbolic-ref HEAD 2> /dev/null | sed -e 's/refs\/heads\///'
}
alias gpthis='git push origin HEAD:$(git_current_branch)'
alias grb='git rebase -p'
alias gup='git fetch origin && grb origin/$(git_current_branch)'
alias gm='git merge --no-ff'

더불어, git editor로 TextMate을 쓰는 설정법에 따라 터미널에서 다음과 같이 적용해 주면 commit 때마다 TextMate 창을 띄워서 보기좋게 diff 정보를 열람할 수도 있다.

$ git config --global core.editor '/usr/local/bin/mate -w'

관련된 주제의 글

댓글을 남겨 주세요