我是否可以根据存储库I'有条件地激活Git提示符;我在吗?

我是否可以根据存储库I'有条件地激活Git提示符;我在吗?,git,bash,git-bash,.bash-profile,Git,Bash,Git Bash,.bash Profile,我正在使用内置程序来改进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 我有一个庞大的企业应用程序存储库(100s的数千个文件,一个非常深的目录树,.git目录几乎是2GB)

我正在使用内置程序来改进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
我有一个庞大的企业应用程序存储库(100s的数千个文件,一个非常深的目录树,
.git
目录几乎是2GB)。提示需要很长时间才能完成

有没有办法告诉
git prompt.sh
忽略此工作区?通过标志或在my
.bashrc

中定义条件Git提示符 请看中建议的Bash提示符定义(但没有用户和主机,因为它们占用了太多空间,并且与您的问题无关):

没有任何东西可以阻止您在命令替换中插入测试,例如:

PS1='[\W$(if true; then __git_ps1 " (%s)"; fi)]\$ '
虽然这个例子很傻。使用这个想法,您可以定义一个条件Git提示符,这样

  • 如果您在违规回购的工作树之外,Git提示符将被激活,并且
  • 如果您在有问题的回购协议中,Git提示符将被取消激活
下面的Bash提示符定义正是这样做的:

export PS1='[\W$(if [[ ! $PWD/ = $OFFENDINGDIR/* ]]; then __git_ps1 " (%s)"; fi)]\$ '
其中,
officingdir
是一个变量,必须为该变量分配到有问题的repo的根目录的路径

例子 假设
~/projectA
是违规回购。有关信息,以下是我的默认提示定义:

PS1='\W\$ '
很简单,;没有Git提示。现在,让我们
cd
转到有问题的存储库:

~$cd项目a
#让我们检查一下我们是否确实在进行Git回购:
projectA$git分行
*主人
#现在,让我们设置条件Git提示符:
projectA$export OfficingDir=$PWD
projectA$export PS1='[\W$(如果[[!$PWD/=$OfficingDir/*]];那么{u git\u PS1'(%s)”;fi)]\$'
#我们的Bash提示符会相应地更改。。。
[项目A]$
# ... 但请注意,它不包含分支信息(如所需)。
#然而,如果我们将cd转换为另一个回购。。。
[projectA]$cd../projectB
[项目B(硕士)]$
# ... Git提示符就在那里,如您所愿!

朱伯斯的回答让我想到。。。我想测试大型存储库能够满足的一些条件。我不想把自己局限于一个存储库。我需要它在这些回购协议的所有子目录中工作

我研究了
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) ]]
这是所有功能中最好的。我可以将此添加到任何回购协议中。它参与“这是git回购吗?”发现并回答提示忽略问题,这一切都在一个过程中完成

我像这样把它放到我的
.bashrc

function __my_ps1 {
  if [[ -z $(git config prompt.ignore) ]];
  then
    __git_ps1 "$PROMPT_PRE" "$PROMPT_POST"
  fi
}

export PROMPT_COMMAND=__my_ps1

我正在使用Git for Windows包中的Git Bash提示符,它已经有了一个非常友好的提示符。我想知道是否需要在任何其他shell中为该提示符命令提供一个
else
分支。

内置的git提示符shell脚本具有每个存储库选项,您可以设置这些选项来加快提示符

bash.showdrityState
设置为
false
设置为:

bash.showUntrackedFiles
设置为
false
设置为:

bash.showUpstream
设置为空字符串:

function __my_ps1 {
  if [[ -z $(git config prompt.ignore) ]];
  then
    __git_ps1 "$PROMPT_PRE" "$PROMPT_POST"
  fi
}

export PROMPT_COMMAND=__my_ps1
$ git config --local --add bash.showDirtyState false
$ git config --local --add bash.showUntrackedFiles false
$ git config --local --add bash.showUpstream ''