如何判断Git是否忽略了当前工作目录?

4
我有一个git控制的目录(实际上是我的主目录),其中有一些忽略的目录(例如垃圾空间和由其他版本控制系统控制的目录)。我希望能够让我的bash提示显示一个目录是否受版本控制,如果是的话,是由哪个版本控制系统控制的,但例如git rev-parse总是会找到最顶层的.git目录。
有没有办法询问git我是否在一个未跟踪的目录中?
我发现这个方法可行:
if ! git rev-parse 2>&/dev/null; then
    echo "not in git"
else
    PREFIX=$(git rev-parse --show-prefix)
    if [ -z "$PREFIX" ]; then
        echo "at git top level"
    elif [ -z $(cd $(git rev-parse --show-toplevel); \
          git ls-files -o --directory "${PREFIX%%/}")
        echo "tracked by git"
    else
        echo "untracked"
    fi
fi

然而这种方法看起来很不专业且容易出错。有没有更好的方式?

4
Git不会跟踪目录,它只会跟踪文件。 - Lily Ballard
是的,但我可以告诉它忽略.gitignore中的目录,因此它对它们有一些了解。 - ecatmur
在.gitignore中忽略一个目录实际上是忽略该目录中的所有文件(并且不会递归进入该目录来检查否定模式)。 - Lily Ballard
3个回答

5

git clean -nd 方法: 如果目录被忽略了,那么 git clean -d 就会删除它,所以这是检查当前目录状态的简单方法。

if git clean -xnd `pwd` | grep 'Would remove \./' > /dev/null; then
    echo "Inside ignored or untracked directory"
else
    echo "Inside normal directory"
fi

修改 git clean 的规则以处理未跟踪的文件。我在我的 $HOME 存储库中检查过了。

注意:不要轻易尝试使用 git clean,除非加上 -n 参数,否则它可能会清除您主目录下的文件。


太好了,谢谢。虽然还有点困惑(为什么我必须使用 pwd 而不是 .?),但比我之前的理解清晰多了。 - ecatmur

2
针对“被忽略”的文件夹问题,您可以使用 git check-ignore命令并测试错误代码。
$ cd ~/project
$ git check-ignore tracked-folder
$ echo $?
1
$ git check-ignore ignored-folder
ignored-folder
$ echo $?
0

未跟踪的文件夹似乎与已跟踪(但未被忽略)的文件夹具有相同的行为。添加一个-v将显示哪些规则使该文件夹(或文件)被忽略。

-1

你可以使用bash_completion和修改过的PROMPT_COMMAND。在我的非正式测试中,它对我有效,但如果出现问题,你需要自己解决。:)

# Add this to your shell startup file (e.g. ~/.bashrc).
export PS1
export PROMPT_COMMAND='
    if fgrep -q "${PWD/\/home\/$LOGNAME\/}" ~/.gitignore; then
        PS1="${debian_chroot:+($debian_chroot)}\u@\h:\w$(__git_ps1) [ignored]\$ "
    else
        PS1="${debian_chroot:+($debian_chroot)}\u@\h:\w$(__git_ps1)\$ "
    fi'

为了使其正常工作,您需要确保所有被忽略的路径都是相对于您的主目录列出的,并且在依赖它来保护您免受任何破坏性操作(如rm -rf)之前一定要进行测试。

不处理:1.每个目录的.gitignore文件,2.全局gitignore文件,3..git/info/exclude文件,4."!exclusion"模式。 - Vi.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接