如何编写 git 命令来分离历史文件?

How to write git commands to separate history file?

我想阻止 git 命令写入 $HISTFILE,而是在它们自己的文件中跟踪它们。

我希望所有非git的命令都写入$HISTFILE,所有匹配"git*"的命令都写入~/.git_history

这是一个想法:

  1. 使用 HISTIGNORE shell 变量从正常命令历史记录中过滤掉所有 git 命令。

  2. 创建一个名为 git 的 shell 函数,将行 git $@ 附加到 ~/.git_history ... 然后执行 /usr/bin/git "$@"

但我认为这不是个好主意。正如@evolutionxbox 指出的那样,如果您过滤掉所有 git 命令,您将无法完成 git 命令的历史记录。 (我会讨厌那个...)

并且这种方法存在一个重大缺陷。你的假 git "history" 文件将只包含 shell 扩展后的 git 命令的命令参数。您不会记录展开的内容,也不会记录任何重定向或管道。


FWIW,我认为 bash 无法将历史列表的不同部分写入不同的文件。所以上面的内容可能会尽可能好......除非你准备修改 bash 本身。

将以下功能添加到您的 .bashrc(或 .bash_login,如果您使用的是 Mac)并重新启动终端。

git() {
   fc -nl -0 | cut -c3- >> ~/.git_history
   history -d -1
   command git "$@"
}

当您在 shell 中使用 git 时,将调用此函数。

  • 第一行提取您的 git 命令将如何存储到 .bash_history(这包括未扩展的变量、引号等)并将其附加到 ~/.git_history
  • 第二行从 bash 的常规历史记录中删除您的 git 命令。
  • 最后一行照常执行您的 git 命令。

如评论中所述,.git_history 将仅作为输入的 git 命令的日志。您不能使用 ctrlR 来取回输入的 git 命令——不是即使在同一会话中。