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

Posted

技术标签:

【中文标题】.bash_history 不会在 Git for Windows (git bash) 中更新【英文标题】:.bash_history does not update in Git for Windows (git bash) 【发布时间】:2012-05-16 08:09:08 【问题描述】:

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

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

如果我手动使用history -w 命令,那么我的文件会更新,但我想了解为什么 shopt 命令无法正常工作。

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

【问题讨论】:

$HISTSIZE$HISTFILESIZE$HISTFILE的值是多少? $HISTSIZE 是 10000,$HISTFILESIZE 是 10000,$HISTFILE 是 /h/.bash_history。 【参考方案1】:

我把这个放在我的~/.bash_profile

PROMPT_COMMAND='history -a'

【讨论】:

为了避免行尾问题,您可以在 Git bash 中键入 echo "PROMT_COMMAND='history -a'" >> ~/.bash_profile 将行添加到 .bash_profile 文件的末尾(或者如果不存在则创建一个新的)。 @Godsmith 您在命令中漏掉了一个“P”:PROM*P*T_COMMAND=... 这在 Win10 上也适用于我。上面的代码使 bash 附加到每个命令的历史文件,as per answer in AskUbuntu。 这适用于在 Visual Studio Code 中运行 git 的 bash,但我不得不把它放在 ~/.bashrc 而不是 ~/.bash_profile。 我更喜欢选项 -n 而不是 -a : ss64.com/bash/history.html【参考方案2】:

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

【讨论】:

很高兴知道这一点,但我很难记住这一点。 @Chance 幸运的是,您不再需要记住这一点,因为在较新版本的 Git for windows 中,这不是真的。在 win7 和 win10 上使用 2.9.3 版本测试。 @Superole 在我的机器上不是真的。我有适用于 Windows 8.1 的 git 2.12.2(04/17 最新版本),我知道保存历史记录的唯一方法是在单击 x 按钮之前键入“exit” 遗憾的是,当 Windows 更新应用并重新启动时也会发生这种情况。 您也可以按Ctrl+D而不是输入exit,它使用起来更快更简单。它甚至比使用关闭按钮还要快!【参考方案3】:

创建以下文件

~/.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 上,终端默认每次都会运行一个登录 shell,因此这与大多数其他系统略有不同,但您可以在首选项中进行配置。

参考文献

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

【讨论】:

感谢您详细解释它的工作原理和原因,以及有关.bash_profile.bashrc 配置文件之间差异的信息。【参考方案4】:

如果您在 VSCode 中使用 Git bash,请参阅上面 C.M. 的评论。

这适用于在 Visual Studio Code 中运行 git 的 bash,但我必须把它放在 ~/.bashrc 而不是 ~/.bash_profile。 - 厘米。 7 月 29 日 14:43

这为我解决了。

【讨论】:

【参考方案5】:

如果您在 Windows 8 上使用 git bash,只需将其放入您的 ~/.bash_logout 文件中:

history > .bash_history

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

问候。

【讨论】:

Windows 8.1 和 GNU bash,版本 3.1.0(1)-release (i686-pc-msys) - 有效! @CamiloMartin - 请参阅我上面关于确保您使用了 Unix 行尾的评论(我使用了 .bash_profile)。 @psdie 感谢您的提醒!停产,那些混蛋。 不适合我。正如@fracz 上面指出的那样,问题是如果您关闭右上角带有 X 的窗口,Git bash 不会保存历史记录。 这个答案对我不起作用,因为历史记录包括命令编号。将 history -w 添加到 ~/.bash_logout 文件确实有效,因为它写入了没有数字的历史记录【参考方案6】:

来自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)

【讨论】:

这非常有效。【参考方案7】:

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

Ps:我使用的是 Windows 10

【讨论】:

【参考方案8】:

我使用的是 Windows 10,这是一个权限问题,我的临时解决方案是添加所有人组并赋予它对 ~/.bash_history 文件的完全控制权。

【讨论】:

【参考方案9】:

顺便说一句,对于那些使用便携式版本的 Git for Windows 的人,不需要创建 .bash_profile 或 .bashrc。只需添加到C:<path to your Git Portable folder>\etc\bash.bashrc

PROMPT_COMMAND='history -a'

【讨论】:

【参考方案10】:

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

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

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

【讨论】:

以上是关于.bash_history 不会在 Git for Windows (git bash) 中更新的主要内容,如果未能解决你的问题,请参考以下文章

Git日常管理

shell基础

Git for Windows 工具的使用

软件git,github for window,tortoisegit有啥区别

002- (~/.bash_history)

Idea+Git