Skip to content

Instantly share code, notes, and snippets.

@bingzhangdai
Last active January 7, 2024 17:31
Show Gist options
  • Save bingzhangdai/dd4e283a14290c079a76c4ba17f19d69 to your computer and use it in GitHub Desktop.
Save bingzhangdai/dd4e283a14290c079a76c4ba17f19d69 to your computer and use it in GitHub Desktop.
Fasted way to get git branch

Sometimes, we want to show current git branch in Bash prompt. git symbolic-ref --short -q HEAD is too slow, especially in WSL. Here is a pure Bash version to print git branch.

function _get_git_branch() {
    local _head_file _head
    local _dir="$PWD"

    while [[ -n "$_dir" ]]; do
        _head_file="$_dir/.git/HEAD"
        if [[ -f "$_dir/.git" ]]; then
            read -r _head_file < "$_dir/.git" && _head_file="$_dir/${_head_file#gitdir: }/HEAD"
        fi
        [[ -e "$_head_file" ]] && break
        _dir="${_dir%/*}"
    done

    if [[ -e "$_head_file" ]]; then
        read -r _head < "$_head_file" || return
        case "$_head" in
            ref:*) printf "${_head#ref: refs/heads/}" ;;
            "") ;;
            # HEAD detached
            *) printf "${_head:0:9}" ;;
        esac
        return 0
    fi

    return 1
}

It is tremendously faster than git command (1ms vs 74ms). Tested on Ubuntu 20.04 (WSL1),

david@Ubuntu:/m/c/U/b/R/T/E/M/T/teeProxyConsole[develop]$ time git symbolic-ref --short -q HEAD
develop

real    0m0.074s
user    0m0.000s
sys     0m0.016s
david@Ubuntu:/m/c/U/b/R/T/E/M/T/teeProxyConsole[develop]$ time _get_git_branch
develop
real    0m0.001s
user    0m0.000s
sys     0m0.016s
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment