DEV Community

Cover image for 🔨Tuning Git Bash🖌️
Pablo Herrero
Pablo Herrero

Posted on

🔨Tuning Git Bash🖌️

Hey! 👋

Today I was fine-tuning my Git Bash, which I use in Windows Terminal, so I decided to leave the steps here in case someone finds it useful.

Installation

Ok, first, install all: Git and Windows Terminal.

Add Git-Bash to Windows Terminal

  • Open setings on Windows Terminal.
  • Generate a Guid: On PowerShell, type [guid]::NewGuid() to generate a new Guid.
  • Insert a new Git-Bash profile:
    {
        // Git Bash
        "guid": "{YOUR GUID}",
        "closeOnExit" : "always",
        "commandline" : 
        "\"%PROGRAMFILES%\\git\\usr\\bin\\bash.exe\" -i -l",
        "icon" : "C:\\Program 
        Files\\Git\\mingw64\\share\\git\\git-for-windows.ico",
        "name" : "Git Bash",
        "startingDirectory" : "%USERPROFILE%",
        "colorScheme": "Dracula"
    },
Enter fullscreen mode Exit fullscreen mode

Removing Git Bash backspace light flicker on Windows Terminal

flicker
Git Bash has incorrect flashing when you hit the backspace key on an empty line. It's a bit annoying and can be fixed with one line of code. First, create .inputrc file into your home:

code ~/.inputrc 
Enter fullscreen mode Exit fullscreen mode

I use code, because I love VSCode, you can use other editor. Then, add this text to the file and save it:

set bell-style none
Enter fullscreen mode Exit fullscreen mode

Styling the prompt

This is the original bash:
original
Well yes, I like the minimalist, but I needed to change the titlebar, remove the MYSYS, and add some information, such as the Git repositories statuses and the time.

There are several ways to do it, my advice is to generate your own .bashrc instead of overwriting the .git-prompt.sh from the Git folder (which will overwrite any Git update and you would lose your customization ...). So, let's start by creating a new .bashrc. Run this code to create it:

code ~/.bashrc
Enter fullscreen mode Exit fullscreen mode

error
You will get a message saying that Git Bash has created a new .bash_profile file. Don't worry, it's fine like this. Now, copy the entire content of the git_prompt.sh file found in your Git folder into the new .bashrc and lets edit it:

Change the titlebar

Change the value:

PS1='\[\033]0;TITTLE$PWD\007\]' # set window title
Enter fullscreen mode Exit fullscreen mode

Remove the MYSYS

Comment it:

#PS1="$PS1"'\[\033[35m\]'       # change to purple
#PS1="$PS1"'$MSYSTEM '          # show MSYSTEM
Enter fullscreen mode Exit fullscreen mode

Git information

Add this to the end of the file and '__git_ps1' will do the rest for you.

#Git status options
export GIT_PS1_SHOWSTASHSTATE=true
export GIT_PS1_SHOWDIRTYSTATE=true
export GIT_PS1_SHOWUNTRACKEDFILES=true
export GIT_PS1_SHOWUPSTREAM="auto"
Enter fullscreen mode Exit fullscreen mode

Time

Add this:

PS1="$PS1"' \[\033[37m\][\A]'  # 24h time, white
Enter fullscreen mode Exit fullscreen mode

Aliases

Finally, how about some aliases? Just add them to the file:

#My aliases
alias gs='git status -sb'
alias gaa='git add --all'
alias gc='git commit -m $2'
alias gp='git push'
alias gpo='git push origin'
alias gpl='git pull'
alias gl="git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

alias ls='ls -F --color=auto --show-control-chars'
alias ll='ls -l'
alias rm='rm -iv'
Enter fullscreen mode Exit fullscreen mode

As a summary, this is the complete code:

#My aliases
alias gs='git status -sb'
alias gaa='git add --all'
alias gc='git commit -m $2'
alias gp='git push'
alias gpo='git push origin'
alias gpl='git pull'
alias gl="git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

alias ls='ls -F --color=auto --show-control-chars'
alias ll='ls -l'
alias rm='rm -iv'

# Prompt style
if test -f /etc/profile.d/git-sdk.sh
then
    TITLEPREFIX=SDK-${MSYSTEM#MINGW}
else
    TITLEPREFIX=$MSYSTEM
fi

if test -f ~/.config/git/git-prompt.sh
then
    . ~/.config/git/git-prompt.sh
else
    PS1='\[\033]0;Git Bash$PWD\007\]' # set window title
    PS1="$PS1"'\n'                 # new line
    PS1="$PS1"'\[\033[32m\]'       # change to green
    PS1="$PS1"'\u@\h '             # user@host<space>
    #PS1="$PS1"'\[\033[35m\]'       # change to purple
    #PS1="$PS1"'$MSYSTEM '          # show MSYSTEM
    PS1="$PS1"'\[\033[33m\]'       # change to white
    PS1="$PS1"'\w'                 # current working directory
    if test -z "$WINELOADERNOEXEC"
    then
        GIT_EXEC_PATH="$(git --exec-path 2>/dev/null)"
        COMPLETION_PATH="${GIT_EXEC_PATH%/libexec/git-core}"
        COMPLETION_PATH="${COMPLETION_PATH%/lib/git-core}"
        COMPLETION_PATH="$COMPLETION_PATH/share/git/completion"
        if test -f "$COMPLETION_PATH/git-prompt.sh"
        then
            . "$COMPLETION_PATH/git-completion.bash"
            . "$COMPLETION_PATH/git-prompt.sh"
            PS1="$PS1"'\[\033[36m\]'  # change color to cyan
            PS1="$PS1"'`__git_ps1`'   # bash function
        fi
    fi
    PS1="$PS1"' \[\033[37m\][\A]'  # 24h time, white
    PS1="$PS1"'\[\033[0m\]'        # change color
    PS1="$PS1"'\n'                 # new line
    PS1="$PS1"'$ '                 # prompt: always $
fi

MSYS2_PS1="$PS1"               # for detection by MSYS2 SDK's bash.basrc

# Evaluate all user-specific Bash completion scripts (if any)
if test -z "$WINELOADERNOEXEC"
then
    for c in "$HOME"/bash_completion.d/*.bash
    do
        # Handle absence of any scripts (or the folder) gracefully
        test ! -f "$c" ||
        . "$c"
    done
fi

#Git status options
export GIT_PS1_SHOWSTASHSTATE=true
export GIT_PS1_SHOWDIRTYSTATE=true
export GIT_PS1_SHOWUNTRACKEDFILES=true
export GIT_PS1_SHOWUPSTREAM="auto"

Enter fullscreen mode Exit fullscreen mode

Very good, it's done! save everything, restart the terminal and enjoy. This is the result, a clean bash with all the basic information in Git Bash:

result

Hope this helps someone. It is not so easy to find it on Google. Cheers🤘

Top comments (6)

Collapse
 
wemu profile image
Werner Mueller

thanks a lot! some cool hints :)

it seems from looking into /C/Program Files/Git/etc/profile.d/git-prompt.sh that customization could just go into ~/.config/git/git-prompt.sh (you copied that switch into your file too "if test -f ~/.config/git/git-prompt.sh")

Collapse
 
capakshay profile image
capakshay • Edited

How to tunning git bash like this?
dev-to-uploads.s3.amazonaws.com/up...

Collapse
 
seraph776 profile image
Seraph★776

According to Mosh Hamedani, if you're on Mac install Zsh and if you're on Windows install posh-git. Source: "Git Tutorial for Beginners: Learn Git in 1 Hour."

Collapse
 
uzair004 profile image
Muhammad Uzair

its probably zsh

Collapse
 
jord profile image
Jordan Turner

How do you do it like this? can't seem to figure it out could you link your git-promt.sh file?

Collapse
 
nihaltowfiq profile image
Nihal Towfiq

Awesome man! thanks!