.bash_history does not update in Git for Windows (git bash)
WindowsGitBashGit BashWindows 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'