0
0

清除 zsh steeef 主题的未追踪标记

Aiur 发表于 2013年01月25日 15:32 | Hits: 1818

我用的 zsh 提示符是oh-my-zsh自带的steeef。最近发现用这个主题时,有些 Rails 项目即使把所有改动都提交后,还是会有红色标记表示存在未追踪文件:

使用git status和git diff,都看不到任何未提交的改动。一开始我以为是 zsh 或者 git 的 bug,把它们的版本都更新到最新版后还是有这个问题。于是看 steeef 主题的源码,发现了红色标记的判断依据:

1
2
3
4
5
6
7
# check for untracked files or updated submodules, since vcs_info doesn't
if git ls-files --other --exclude-standard --directory 2> /dev/null | grep -q "."; then
    PR_GIT_UPDATE=1
    FMT_BRANCH="(%{$turquoise%}%b%u%c%{$hotpink%}●${PR_RST})"
else
    FMT_BRANCH="(%{$turquoise%}%b%u%c${PR_RST})"
fi

因为 vcs_info 没有提供未追踪文件或模块的方法,作者在这里用了git ls-files --other --exclude-standard --directory检测当前项目是否包含未追踪的文件,而在我的项目根目录下运行这个命令后,可以看到有三个目录未被追踪:

1
2
3
4
$ git ls-files --others --exclude-standard --directory
log/
public/system/
tmp/

这几个目录在 .gitignore 中都有声明,当时项目刚创建时借用了gitignore中的模版,相关的声明是:

1
2
3
/log/*
/tmp/*
/public/system/*

看来问题就出在这里用了通配符 *,把目录下的所有文件而不是目录本身忽略了。因为 git 不允许把空目录加到项目中,git status和git ignore都不会显示这些目录,而作者检测时用的git ls-files --directory又会包含未追踪的空目录,就出现了这个提示有改动却找不到的情况。知道问题后解决方案很简单,把 .gitignore 文件中的xxx/*都改成xxx/,或者把--directory参数去掉就好了。

⚓ Permalink

原文链接: http://blog.yxwang.me/2013/01/cleaning-zsh-vcs-status/

0     0

评价列表(0)