我可以有条件地激活Git提示,具体取决于我所在的存储库吗?

时间:2015-03-30 20:03:58

标签: git bash git-bash .bash-profile

我使用内置的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

3 个答案:

答案 0 :(得分:4)

Jubobs的回答让我思考......我想测试一下大型存储库满足的条件。我不想将自己限制在一个存储库中。我需要这个在这些回购的所有子目录中工作。

我探索了git命令本身。它在目录树中搜索.git文件夹做了大量工作。例如,如果您在git repo中,则此命令将退出0,否则返回非零。

$ git rev-parse --git-dir &>/dev/null

这很整洁,但还不够。我想知道我是否在使用git repo而忽略了提示。但是,我不想结合复杂的条件。然后我考虑使用自定义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分支。

答案 1 :(得分:3)

定义条件Git提示

git-prompt.sh中查看建议的Bash提示定义(但没有用户和主机,因为它们占用了太多空间,并且对您的问题不敏感):

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!

答案 2 :(得分:1)

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

bash.showDirtyState设置为falsedisable checking for changes

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

bash.showUntrackedFiles设置为falsestop 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 ''