为什么我需要 运行 我的 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'.
到目前为止我尝试了什么
- 尝试删除
GB
定义周围的引号 -- 行为没有变化
- 尝试在
precmd
中包含 GB 分配 -- 行为没有变化
除了这些尝试之外,我有点不确定还能做什么,非常感谢一些见解和帮助,使这个方便的功能成为现实。谢谢!
函数中的第二行设置了另一个函数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_}"
}
这也是未经测试的。
我正在尝试创建一个 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'.
到目前为止我尝试了什么
- 尝试删除
GB
定义周围的引号 -- 行为没有变化 - 尝试在
precmd
中包含 GB 分配 -- 行为没有变化
除了这些尝试之外,我有点不确定还能做什么,非常感谢一些见解和帮助,使这个方便的功能成为现实。谢谢!
函数中的第二行设置了另一个函数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_}"
}
这也是未经测试的。