user2610733
user2610733

Reputation: 101

Git branch name in prompt

I am able to show the git branch name in the shell prompt. But whenever I am using screen I am getting

bash: parse_git_branch: command not found

and git branch is not shown. Please help me get this in the screen sessions also.

I have following in my .bash_profile.

parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/
}

export PS1="[\W\$(parse_git_branch)]$ "

I don't have .git-completion.bash

System specs:

Upvotes: 10

Views: 8503

Answers (5)

Mazel Tov
Mazel Tov

Reputation: 2182

I had the same error in OS X High Sierra when switching to root or when starting to ssh-agent /bin/bash I resolved it to put it in /etc/bashrc with check if i am root

if [[ $UID == 0 ]]; then
        PS1="\[\e[1;31;40m\]\u@\h \W\[\e[0m\]\$ "
else
        parse_git_branch() {
                git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
        }
        PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ "
fi

Upvotes: 1

Simon Soriano
Simon Soriano

Reputation: 813

When you open your terminal, .bash_profile is executed and therefore PS1 is defined. Then you execute screen, and screen reads the environment variable PS1 which includes a call to parse_git_branch and tries to parse it. But, since screen didn't execute .bash_profile the function parse_git_branch is not defined inside screen.

Move the definition of PS1 to .bashrc because both, screen and iTerm execute it.

Upvotes: 5

Gilad Halevy
Gilad Halevy

Reputation: 61

This is much simpler and avoids the unnecessary sed:

parse_git_branch () {

    while read -r branch; do
        [[ $branch = \** ]] && current_branch=${branch#* }
    done < <(git branch 2>/dev/null)

    [[ $current_branch ]] && printf ' [%s]' "$current_branch"

}

Upvotes: 3

koomie
koomie

Reputation: 51

I had the same issue when running under screen and was able to resolve by moving the definition of the parse_git_branch() function from .bash_profile to .bashrc.

Upvotes: 5

Nick Tomlin
Nick Tomlin

Reputation: 29211

You are missing a ' at the end of your sed statement:

parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="[\W\$(parse_git_branch)]$ "

Othewerise, it seems to work for me in bash-3.2

Upvotes: 2

Related Questions