我可以根据我所在的存储库有条件地激活 Git 提示吗?
Can I conditionally activate the Git prompt depending on the repository I'm in?
我正在使用内置 git prompt shell script 来改进我的 Bash 提示。
. ~/git-completion.bash
. ~/git-prompt.sh
export GIT_PS1_SHOWDIRTYSTATE=1
export GIT_PS1_SHOWUNTRACKEDFILES=1
export GIT_PS1_SHOWUPSTREAM="auto"
export GIT_PS1_SHOWCOLORHINTS=1
我有一个巨大的企业应用程序存储库(数千个文件,一个非常深的目录树,.git
目录几乎有 2 GB)。提示需要很长时间才能完成。
有什么方法可以告诉 git-prompt.sh
忽略这个工作区吗?通过标志或在我的 .bashrc
?
定义条件 Git 提示
查看git-prompt.sh
中建议的Bash提示定义(但没有用户和主机,因为它们占用太多space,与您的问题无关) :
PS1='[\W$(__git_ps1 " (%s)")]$ '
没有什么能阻止您在命令替换中插入测试,如下所示:
PS1='[\W$(if true; then __git_ps1 " (%s)"; fi)]$ '
虽然这个例子有点傻。使用这个想法,您可以定义一个条件 Git 提示,这样,
- 如果您在有问题的仓库的工作树之外,Git 提示将被激活,并且
- 如果您在 有问题的回购中,Git 提示将被停用。
以下 Bash 提示定义正是这样做的:
export PS1='[\W$(if [[ ! $PWD/ = $OFFENDINGDIR/* ]]; then __git_ps1 " (%s)"; fi)]$ '
其中 OFFENDINGDIR
是一个变量,必须将路径分配给有问题的存储库的根目录。
例子
假设 ~/projectA
是有问题的回购协议。有关信息,这是我的默认提示定义:
PS1='\W$ '
很简单;没有任何 Git 提示。现在,让我们 cd
到有问题的存储库:
~$ cd projectA
# Let's check that we are indeed in a Git repo:
projectA$ git branch
* master
# Now let's set up our conditional Git prompt:
projectA$ export OFFENDINGDIR=$PWD
projectA$ export PS1='[\W$(if [[ ! $PWD/ = $OFFENDINGDIR/* ]]; then __git_ps1 " (%s)"; fi)]$ '
# Our Bash prompt changes accordingly...
[projectA]$
# ... but notice that it contains no branch info (as desired).
# However, if we cd to another repo...
[projectA]$ cd ../projectB
[projectB (master)] $
# ... the Git prompt is there, as desired!
Jubobs 的回答让我开始思考...我想测试大型存储库可以满足的某些条件。我不想将自己局限于一个存储库。我需要它在这些存储库的所有子目录中工作。
我探索了 git
命令本身。它做了很多工作来搜索 .git
文件夹的目录树。例如,如果您在 git 存储库中,此命令将退出 0,否则将退出非零。
$ git rev-parse --git-dir &>/dev/null
很好,但还不够。我想知道我是否在 git 存储库中并忽略了提示。但是,我不想组合复杂的条件。然后我考虑使用自定义 git 配置键。
$ git config --local prompt.ignore 1
我可以 运行 这个测试看它是否非空。我应该弄清楚如何测试 0 或空与非空,但这是一个开始。
$ [[ -z $(git config prompt.ignore) ]]
这是所有功能中最好的。我可以将它添加到任何回购协议中。参与"is this a git repo?"发现和回答提示忽略问题,一应俱全!
我像这样将它融入我的 .bashrc
function __my_ps1 {
if [[ -z $(git config prompt.ignore) ]];
then
__git_ps1 "$PROMPT_PRE" "$PROMPT_POST"
fi
}
export PROMPT_COMMAND=__my_ps1
我正在使用 Git 中的 Git Bash 提示 for Windows 包,它已经有一个非常友好的提示。我想知道是否需要在任何其他 shell.
中为该提示命令提供 else
分支
built-in git 提示 shell 脚本有 per-repository 个选项,您可以设置这些选项来加快提示速度。
设置bash.showDirtyState
到false
到disable checking for changes:
$ git config --local --add bash.showDirtyState false
设置bash.showUntrackedFiles
到false
到stop checking for untracked files:
$ git config --local --add bash.showUntrackedFiles false
设置bash.showUpstream
为空串为stop comparing HEAD with its upstream:
$ git config --local --add bash.showUpstream ''
我正在使用内置 git prompt shell script 来改进我的 Bash 提示。
. ~/git-completion.bash
. ~/git-prompt.sh
export GIT_PS1_SHOWDIRTYSTATE=1
export GIT_PS1_SHOWUNTRACKEDFILES=1
export GIT_PS1_SHOWUPSTREAM="auto"
export GIT_PS1_SHOWCOLORHINTS=1
我有一个巨大的企业应用程序存储库(数千个文件,一个非常深的目录树,.git
目录几乎有 2 GB)。提示需要很长时间才能完成。
有什么方法可以告诉 git-prompt.sh
忽略这个工作区吗?通过标志或在我的 .bashrc
?
定义条件 Git 提示
查看git-prompt.sh
中建议的Bash提示定义(但没有用户和主机,因为它们占用太多space,与您的问题无关) :
PS1='[\W$(__git_ps1 " (%s)")]$ '
没有什么能阻止您在命令替换中插入测试,如下所示:
PS1='[\W$(if true; then __git_ps1 " (%s)"; fi)]$ '
虽然这个例子有点傻。使用这个想法,您可以定义一个条件 Git 提示,这样,
- 如果您在有问题的仓库的工作树之外,Git 提示将被激活,并且
- 如果您在 有问题的回购中,Git 提示将被停用。
以下 Bash 提示定义正是这样做的:
export PS1='[\W$(if [[ ! $PWD/ = $OFFENDINGDIR/* ]]; then __git_ps1 " (%s)"; fi)]$ '
其中 OFFENDINGDIR
是一个变量,必须将路径分配给有问题的存储库的根目录。
例子
假设 ~/projectA
是有问题的回购协议。有关信息,这是我的默认提示定义:
PS1='\W$ '
很简单;没有任何 Git 提示。现在,让我们 cd
到有问题的存储库:
~$ cd projectA
# Let's check that we are indeed in a Git repo:
projectA$ git branch
* master
# Now let's set up our conditional Git prompt:
projectA$ export OFFENDINGDIR=$PWD
projectA$ export PS1='[\W$(if [[ ! $PWD/ = $OFFENDINGDIR/* ]]; then __git_ps1 " (%s)"; fi)]$ '
# Our Bash prompt changes accordingly...
[projectA]$
# ... but notice that it contains no branch info (as desired).
# However, if we cd to another repo...
[projectA]$ cd ../projectB
[projectB (master)] $
# ... the Git prompt is there, as desired!
Jubobs 的回答让我开始思考...我想测试大型存储库可以满足的某些条件。我不想将自己局限于一个存储库。我需要它在这些存储库的所有子目录中工作。
我探索了 git
命令本身。它做了很多工作来搜索 .git
文件夹的目录树。例如,如果您在 git 存储库中,此命令将退出 0,否则将退出非零。
$ git rev-parse --git-dir &>/dev/null
很好,但还不够。我想知道我是否在 git 存储库中并忽略了提示。但是,我不想组合复杂的条件。然后我考虑使用自定义 git 配置键。
$ git config --local prompt.ignore 1
我可以 运行 这个测试看它是否非空。我应该弄清楚如何测试 0 或空与非空,但这是一个开始。
$ [[ -z $(git config prompt.ignore) ]]
这是所有功能中最好的。我可以将它添加到任何回购协议中。参与"is this a git repo?"发现和回答提示忽略问题,一应俱全!
我像这样将它融入我的 .bashrc
function __my_ps1 {
if [[ -z $(git config prompt.ignore) ]];
then
__git_ps1 "$PROMPT_PRE" "$PROMPT_POST"
fi
}
export PROMPT_COMMAND=__my_ps1
我正在使用 Git 中的 Git Bash 提示 for Windows 包,它已经有一个非常友好的提示。我想知道是否需要在任何其他 shell.
中为该提示命令提供else
分支
built-in git 提示 shell 脚本有 per-repository 个选项,您可以设置这些选项来加快提示速度。
设置bash.showDirtyState
到false
到disable checking for changes:
$ git config --local --add bash.showDirtyState false
设置bash.showUntrackedFiles
到false
到stop checking for untracked files:
$ git config --local --add bash.showUntrackedFiles false
设置bash.showUpstream
为空串为stop comparing HEAD with its upstream:
$ git config --local --add bash.showUpstream ''