. bash_history 在 Git for Windows 中不更新(Git bash)

我正在使用 Git for Windows (ver。1.7.8-preview20111206).在我的 HOME 文件夹中的 bash _ history 文件,它从来不会自动更新。启动 Git Bash 时,我可以在手动添加到。Bash _ history 文件,但它不会自动更新。

我使用了 shopt -s histappend命令来确保每次关闭 shell 时都能保存历史记录,但是它不起作用。

如果我手动使用 history -w命令,那么我的文件将得到更新,但是我想知道 shopt 命令为什么不能像我理解的那样工作。

谁能告诉我为什么会发生这种行为?

30556 次浏览

I put this in my ~/.bash_profile

PROMPT_COMMAND='history -a'

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.

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.

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.

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

Ps: I am using windows 10

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 the 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

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.

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'

There is a more complete answer on 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"

Please be careful, though:

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

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'