我需要在后台执行任何 cd 命令之后运行 git fetch,并且仅当我位于 git 目录中时。
答案1
这分为三个部分:
- 运行一些代码来更改当前目录。在 zsh 中,您将此代码放入
chpwd
功能,或数组中具有不同名称的函数chpwd_functions
(例子)。看进入目录时执行 bash 脚本用于 bash 实现。 - 检测 git 工作副本。既然你只对 git 感兴趣,你可以跑
git rev-parse --show-toplevel
。如果您对其他版本控制系统感兴趣,还有更高级的框架可以检测版本控制。 - 跑步
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 的启动文件中。
这里发生了一些事情:
- 首先,我们使用自己的自定义代码
function cd() {
覆盖内置行为。cd
- 显然我们仍然想更改目录,所以我们首先这样做 - 我们在它前面添加
builtin
* 前缀,以便 shell 使用内置函数cd
而不是递归调用我们的自定义函数,并且我们将其作为参数cd()
提供,该参数由 shell 扩展$@
提供给函数的所有参数。 - 我们通过测试
.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 &
.