🔨Tuning Git Bash🖌️
Tags: bash, git, terminal, shell
Published: 2020-09-16 16:45:00

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](https://www.google.com/search?q=git&oq=git+&aqs=chrome.0.69i59j35i39l2j69i60l4j69i65.1401j0j4&sourceid=chrome&ie=UTF-8) and [Windows Terminal](https://www.microsoft.com/es-es/p/windows-terminal/9n0dx20hk701?activetab=pivot:overviewtab).

##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"
    },
``` 

##Removing Git Bash backspace light flicker on Windows Terminal
![flicker](https://dev-to-uploads.s3.amazonaws.com/i/g1tc5sqmronmgdvirats.gif)
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 
```
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
```    
##Styling the prompt
This is the original bash:
![original](https://dev-to-uploads.s3.amazonaws.com/i/uvze994hatpa30crra68.jpg)
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
```
![error](https://dev-to-uploads.s3.amazonaws.com/i/l2swounx3zxxzue35y55.jpg)
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
```
###Remove the MYSYS
Comment it:
```
#PS1="$PS1"'\[\033[35m\]'       # change to purple
#PS1="$PS1"'$MSYSTEM '          # show MSYSTEM
```
###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"
```
###Time
Add this:
```
PS1="$PS1"' \[\033[37m\][\A]'  # 24h time, white
```
##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'
```
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"

```
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](https://dev-to-uploads.s3.amazonaws.com/i/zsgdvtylerced37gm7g6.jpg)

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