我可以根据我所在的存储库有条件地激活 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.showDirtyStatefalsedisable checking for changes:

$ git config --local --add bash.showDirtyState false

设置bash.showUntrackedFilesfalsestop 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 ''