为什么我需要 运行 我的 zsh 别名两次才能将 vcs_info 分配给一个变量?

Why do I need to run my zsh alias twice to assign vcs_info to a variable?

我正在尝试创建一个 zsh 别名 pog,它将本地分支强制推送到一个不存在的同名远程分支,并在此过程中创建它。

虽然我已经能够让它工作——有点——它需要我运行 别名函数两次 而不是一次。由于此别名的目的是缩短执行此例程 git 任务所需的步骤数,因此我正在寻求有关重构代码的帮助,以便它在第一时间正确执行。

这是别名:

function pog() {
  autoload -Uz vcs_info
  precmd() { vcs_info }
  GB="$(echo ${vcs_info_msg_0_} | ggrep -Pio '(?<=\(git\)-\[).*(?=\]-)')"
  git push --set-upstream origin ${GB}
}

这是它当前(错误)行为的示例:

Documents/dev/test  test-123 ✔                                                              7m
▶ pog
fatal: The current branch test-123 has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin test-123


Documents/dev/test  test-123 ✔                                                             7m  ⍉
▶ pog
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote:
remote: Create a pull request for 'test-123' on GitHub by visiting:
remote:      https://github.com/mr-potato/test/pull/new/test-123
remote:
To github.com:mr-potato/test.git
 * [new branch]          test-123 -> test-123
Branch 'test-123' set up to track remote branch 'test-123' from 'origin'.

到目前为止我尝试了什么

除了这些尝试之外,我有点不确定还能做什么,非常感谢一些见解和帮助,使这个方便的功能成为现实。谢谢!

函数中的第二行设置了另一个函数precmd(),通常用于向zsh提示符添加信息。它不会调用 vcs_info 或设置 vcs_info_msg_0_ 变量 - 稍后发生,当 zsh 生成提示时。这就是它第二次可用的原因。
试试这个(注意:我没有测试过):

function pog() {
  autoload -Uz vcs_info
  vcs_info
  GB="$(echo ${vcs_info_msg_0_} | ggrep -Pio '(?<=\(git\)-\[).*(?=\]-)')"
  git push --set-upstream origin ${GB}
}

如果可行,您可以通过 vcs_info 到 return 只是 git 分支来进一步优化它。这进入 ~/.zshrc:

autoload -Uz vcs_info
zstyle ':vcs_info:git:*' formats '%b'
function pog() {
  vcs_info
  git push --set-upstream origin "${vcs_info_msg_0_}"
}

这也是未经测试的。