.bash_history does not update in Git for Windows (git bash)

WindowsGitBashGit Bash

Windows Problem Overview


I am using Git for Windows (ver. 1.7.8-preview20111206) and even though I have a .bash_history file in my HOME folder, it never automatically gets updated. When I start Git Bash, I can see in the history commands that I manually added to the .bash_history file, but it does not get updated automatically.

I used the shopt -s histappend command to make sure that the history gets saved every time I close the shell, but it does not work.

If I manually use the history -w command, then my file gets updated, but I would want to understand why the shopt command does not work as I understand it should.

Anyone can tell me why is this behavior happening?

Windows Solutions


Solution 1 - Windows

I put this in my ~/.bash_profile

PROMPT_COMMAND='history -a'

Solution 2 - Windows

As it was said here, to save git bash history on Windows you must not close the terminal with X button. Use exit command instead. History of commands will be saved then regardless of configuration mentioned in the accepted answer.

Solution 3 - Windows

Create the following files

~/.bash_profile
~/.bashrc

And put the following line in both of them

PROMPT_COMMAND='history -a'

To do this from the console (git bash) itself use the following commands

echo "PROMPT_COMMAND='history -a'" >> ~/.bash_profile
echo "PROMPT_COMMAND='history -a'" >> ~/.bashrc

What history -a means

From history --help command > -a append history lines from this session to the history file

What is PROMPT_COMMAND ?

> Bash provides an environment variable called PROMPT_COMMAND. The contents of this variable are executed as a regular Bash command just before Bash displays a prompt.

Difference between .bash_profile AND .bashrc

.bash_profile is executed for login shells, while .bashrc is executed for interactive non-login shells.

When you login (type username and password) via console, either sitting at the machine, or remotely via ssh: .bash_profile is executed to configure your shell before the initial command prompt.

But, if you’ve already logged into your machine and open a new terminal window (xterm) then .bashrc is executed before the window command prompt. .bashrc is also run when you start a new bash instance by typing /bin/bash in a terminal.

On OS X, Terminal by default runs a login shell every time, so this is a little different to most other systems, but you can configure that in the preferences.

References

https://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x264.html https://apple.stackexchange.com/questions/51036/what-is-the-difference-between-bash-profile-and-bashrc

Solution 4 - Windows

If you're using Git bash in VSCode please see C.M.'s comment above.

> This worked for running git's bash in Visual Studio Code, but I had to put it ~/.bashrc not ~/.bash_profile. – C.M. Jul 29 at 14:43

This solved it for me.

Solution 5 - Windows

If you use git bash for windows 8, just put this in your ~/.bash_logout file:

history > .bash_history

Obviously you need a ~/.bash_history file.

Regards.

Solution 6 - Windows

A more complete answer from Unix Stackexchange, by Pablo R. and LinuxSecurityFreak:

Add the following to your ~/.bashrc

# Avoid duplicates
HISTCONTROL=ignoredups:erasedups
# When the shell exits, append to the history file instead of overwriting it
shopt -s histappend

# After each command, append to the history file and reread it
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

Be Careful as: "The problem with this PROMPT_COMMAND solution is that the numbers for each history item changes after each command :(. For example if you type history(1) ls (2) rm, then you do !1 to repeat (1), the history number might change and might run the rm command..." (Chris Kimpton)

Solution 7 - Windows

For me what worked was going into C:\Users\MY_USER\ and deleting the .bash_profile file.

Ps: I am using windows 10

Solution 8 - Windows

I am using Windows 10 for me it was a permission problem, my temporary solution was to add Everyone group and give it Full control on ~/.bash_history file.

Solution 9 - Windows

By the way, for those using the Portable version of Git for Windows, there's no need to create .bash_profile or .bashrc. Simply add to C:<path to your Git Portable folder>\etc\bash.bashrc:

PROMPT_COMMAND='history -a'

Solution 10 - Windows

Found an answer in another post : https://superuser.com/questions/555310/bash-save-history-without-exit

If you want to have an history updated between two terminals.

As a window user I created a file .bash_profile inside my user folder. And then I add the following content : PROMPT_COMMAND='history -a;history -c;history -r'

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionfranmonView Question on Stackoverflow
Solution 1 - WindowsZomboView Answer on Stackoverflow
Solution 2 - WindowsfraczView Answer on Stackoverflow
Solution 3 - WindowsAnddoView Answer on Stackoverflow
Solution 4 - WindowsChrisView Answer on Stackoverflow
Solution 5 - WindowsRemy TiconaView Answer on Stackoverflow
Solution 6 - WindowsSylvainView Answer on Stackoverflow
Solution 7 - WindowsSamuel SouzaView Answer on Stackoverflow
Solution 8 - WindowsmmahgoubView Answer on Stackoverflow
Solution 9 - Windowsd.lacherView Answer on Stackoverflow
Solution 10 - WindowsFlament MickaëlView Answer on Stackoverflow