在执行任何 cd 命令后运行 git fetch

在执行任何 cd 命令后运行 git fetch

我需要在后台执行任何 cd 命令之后运行 git fetch,并且仅当我位于 git 目录中时。

答案1

这分为三个部分:

  1. 运行一些代码来更改当前目录。在 zsh 中,您将此代码放入chpwd功能,或数组中具有不同名称的函数chpwd_functions例子)。看进入目录时执行 bash 脚本用于 bash 实现。
  2. 检测 git 工作副本。既然你只对 git 感兴趣,你可以跑git rev-parse --show-toplevel。如果您对其他版本控制系统感兴趣,还有更高级的框架可以检测版本控制。
  3. 跑步git fetch

这是更改为 git 存储库时chpwd运行的实现。git fetch

chpwd () {
  set -- "$(git rev-parse --show-toplevel 2>/dev/null)"
  # If cd'ing into a git working copy and not within the same working copy
  if [ -n "$1" ] && [ "$1" != "$vc_root" ]; then
    vc_root="$1"
    git fetch
  fi
}
chpwd

此代码位于您的 shell 启动脚本中:.zshrc对于 zsh,.bashrc对于 bash(在 bash 中您还需要chpwd调用目录更改的包装器)。

答案2

您可以使用一个函数:

function cd() {
    builtin cd "$@"
    if [[ -d .git ]]; then
        git fetch &
    fi
}

将其添加到 shell 的启动文件中。

这里发生了一些事情:

  1. 首先,我们使用自己的自定义代码function cd() {覆盖内置行为。cd
  2. 显然我们仍然想更改目录,所以我们首先这样做 - 我们在它前面添加builtin* 前缀,以便 shell 使用内置函数cd而不是递归调用我们的自定义函数,并且我们将其作为参数cd()提供,该参数由 shell 扩展$@提供给函数的所有参数。
  3. 我们通过测试.git目录是否存在来测试是否位于 git 存储库中,如果存在,我们运行git fetch,告诉 shell 通过附加&.

请注意, 的输出git fetch仍将发送到终端。如果你想放弃它,你可以使用这个:

git fetch & 2>&1 >/dev/null

这会将 stderr 重定向到 stdout,然后将 stdout 发送到/dev/null.

[*]:请注意,这builtin不在 POSIX 中,因此该解决方案不能跨所有 shell 移植

[^]:如果 git 存储库是裸露的,则此操作会失败,但几乎可以肯定您的驱动器上不会有裸露的存储库,所以谁在乎

答案3

在主目录中的 .bashrc 或 .zshrc 文件中创建一个函数。

将以下内容添加到文件底部:

cd_fetch() {
    command cd "$@"
    if [ -d .git ]; then
        git fetch & 
    fi
}
alias cdg=cd_fetch

现在关闭并重新打开终端或运行,现在您可以使用刚刚指定别名的source ~/.zshrc命令更改目录。cdg

另外,如果您不想使用cdg并且想要使用,只需cd将别名定义更改为alias cd=cd_fetch.

这种方法仍然会输出 git fetch 通常执行的所有操作,为了使其静音,请git fetch &替换git fetch 2>&1 >/dev/null &.

相关内容