在Git for Windows (git bash)中,.bash_history没有更新

113

我正在使用 Git for Windows (ver. 1.7.8-preview20111206),尽管我在 HOME 文件夹中有一个 .bash_history 文件,但它从未自动更新。当我启动 Git Bash 时,我可以看到手动添加到 .bash_history 文件的历史命令,但它不会自动更新。

我使用了 shopt -s histappend 命令确保每次关闭 shell 时都保存历史记录,但它无效。

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

有人能告诉我为什么会出现这种情况吗?


$HISTSIZE$HISTFILESIZE$HISTFILE的值是什么? - Dennis Williamson
$HISTSIZE 是 10000,$HISTFILESIZE 是 10000,而 $HISTFILE 是 /h/.bash_history。 - franmon
11个回答

146

我把这个放在了我的~/.bash_profile里。

PROMPT_COMMAND='history -a'

12
为避免行尾问题,你可以在 Git Bash 中键入 echo "PROMT_COMMAND='history -a'" >> ~/.bash_profile,将此行添加到你的 .bash_profile 文件末尾(如果不存在,则创建一个新文件)。请注意不要改变原文的意思。 - Godsmith
9
你漏了一个字母'P',正确的指令是PROM*P*T_COMMAND=... - M'sieur Toph'
3
这对我在Win10上也有效。根据AskUbuntu中的答案,以上代码使bash在每个命令后追加到历史文件。 - Marius Tamulis
11
这个方法适用于在Visual Studio Code中运行git的bash,但我必须将它放在/.bashrc而不是/.bash_profile中。 - C.M.
3
我更喜欢使用选项-n而不是-a: https://ss64.com/bash/history.html - gawkface

72
创建以下文件。
~/.bash_profile
~/.bashrc

并将以下行放入其中两个文件中

PROMPT_COMMAND='history -a'

要从控制台(Git Bash)中执行此操作,请使用以下命令:

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

什么是history -a

history --help命令得知

-a 将本次会话的历史记录追加到历史文件中

PROMPT_COMMAND是什么?

Bash提供了一个环境变量称为PROMPT_COMMAND。该变量的内容作为常规Bash命令在Bash显示提示符之前执行。

.bash_profile.bashrc之间的区别

.bash_profile适用于登录shell,而.bashrc适用于交互式非登录shell。

当您通过控制台登录(输入用户名和密码),无论是坐在机器旁还是通过ssh远程登录时,都将执行.bash_profile以在初始命令提示符之前配置您的shell。

但是,如果您已经登录到计算机并打开了新的终端窗口(xterm),则在窗口命令提示符之前执行.bashrc。在终端中键入/bin/bash以启动新的bash实例时也会运行.bashrc

在OS X上,默认情况下,Terminal每次都运行登录shell,因此这与大多数其他系统略有不同,但是您可以在首选项中进行配置。

参考资料


10
非常感谢您详细地解释了它的工作原理以及为什么这样做,并提供了有关 .bash_profile.bashrc 配置文件之间区别的信息。 - Alex Marty

45

正如这里所说,要在Windows上保存Git Bash历史记录,您不能使用X按钮关闭终端。请改用exit命令。这样,无论接受的回答中提到的配置如何,命令历史记录都将被保存。


21
知道这个很好,但我会很难记住的。 - Chance
3
@Chance 幸运的是,你不再需要记住这个了,因为在较新版本的Git for Windows中,这已经不再是真的了。在win7和win10上测试过版本2.9.3。 - Superole
4
@Superole 在我的电脑上不是这样的。我使用的是Windows 8.1版的Git 2.12.2(截至04/17最新版本),我所知道的保留历史记录的唯一方法是在单击关闭按钮之前输入“exit”。 - Sebastian
2
当Windows更新应用并重新启动时,遗憾的是这也会发生。 - dbreaux
9
你也可以按下Ctrl+D,而不是输入exit,这样使用起来更快速、更简便。它甚至比使用关闭按钮还要快! - EvgenKo423

12

Unix Stackexchange 上有一份更完整的回答,由Pablo R.和LinuxSecurityFreak提供。请将以下内容添加到您的~/.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"

但请小心:

使用这种PROMPT_COMMAND的解决方案的问题在于每个历史记录项目的编号在每个命令之后都会改变。例如,如果您键入history(1)ls(2)rm,然后您执行!1重复(1),历史记录编号可能会更改并运行rm命令。 Chris Kimpton


我使用了简化版本的命令 PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a;",效果非常好。我之前对提示符进行了自定义,但是简单地使用 PROMPT_COMMAND="history -a" 并不适用。这真是救了我一命! - undefined

12
如果您在VSCode中使用Git bash,请参见C.M.上面的评论。
这适用于在Visual Studio Code中运行git的bash,但我必须将其放在~/.bashrc而不是~/.bash_profile。- C.M. Jul 29 at 14:43
这对我解决了问题。

6
如果您使用Windows 8的Git Bash,只需在您的~/.bash_logout文件中输入以下内容即可:
history > .bash_history

显然,你需要一个 ~/.bash_history 文件。
祝好。

Windows 8.1和GNU bash,版本3.1.0(1)-release(i686-pc-msys)-可以工作! - pbaranski
2
@CamiloMartin - 请看我上面的评论,确保你已经使用了Unix行结束符(我使用了.bash_profile)。 - psdie
2
@psdie 感谢提醒!EOL字符真是讨厌。 - Camilo Martin
4
无法运作。如@fracz在上面指出的那样,问题在于如果您使用右上角的X关闭窗口,Git bash不会保存历史记录。 - Godsmith
1
这个答案对我没用,因为历史记录包括命令编号。将history -w添加到~/.bash_logout文件中确实有效,因为它会写入没有数字的历史记录。 - harleybl

1
我正在使用Windows 10,遇到了权限问题。我的临时解决方案是添加“Everyone”组并在~/.bash_history文件上授予它完全控制权限。

1

对我来说有效的方法是进入C:\Users\MY_USER\并删除.bash_profile文件。

附注:我使用的是Windows 10操作系统。


0

在另一篇帖子中找到了答案:https://superuser.com/questions/555310/bash-save-history-without-exit

如果您想要在两个终端之间更新历史记录。

作为一个Windows用户,我在我的用户文件夹中创建了一个名为.bash_profile的文件。然后我添加了以下内容:PROMPT_COMMAND='history -a;history -c;history -r'


0

顺便提一下,对于使用Windows上可移植版Git的用户来说,不需要创建.bash_profile或.bashrc文件。只需添加到C:<您的Git Portable文件夹路径>\etc\bash.bashrc即可:

PROMPT_COMMAND='history -a'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接