【问题标题】:.bash_history does not update in Git for Windows (git bash).bash_history 不会在 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。

标签: windows git bash git-bash


【解决方案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'

          【讨论】:

            猜你喜欢
            • 2015-11-17
            • 2018-04-17
            • 2012-11-20
            • 1970-01-01
            • 1970-01-01
            • 2016-09-05
            • 2012-04-25
            • 2020-06-29
            • 2014-04-15
            相关资源
            最近更新 更多