.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) 中更新的主要内容,如果未能解决你的问题,请参考以下文章