【问题标题】:How can I tell whether the current working directory is ignored by Git?如何判断当前工作目录是否被 Git 忽略?
【发布时间】:2012-06-06 02:31:01
【问题描述】:

我有一个 git 控制的目录(实际上是我的主目录),其中有被忽略的目录(例如垃圾空间,以及由其他 VCS 控制的目录)。我希望能够让我的 bash 提示符显示目录是否受版本控制,如果是,则由哪个 VCS 控制,但例如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

但它看起来非常老套和脆弱。有没有更好的办法?

【问题讨论】:

  • Git 不跟踪目录。它只跟踪文件。
  • 没错,但我可以告诉它忽略.gitignore 中的目录,所以它对它们有一些了解。
  • 忽略 .gitignore 中的目录实际上只是忽略了目录中的所有文件(甚至没有递归到目录中检查否定模式的副作用)。

标签: git bash directory gitignore


【解决方案1】:

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 存储库。

注意:不要轻易尝试没有-ngit clean,它可以清除你家的东西。

【讨论】:

  • 太好了,谢谢。它仍然有点令人困惑(为什么我必须使用pwd 而不仅仅是.?)但比我所拥有的要清晰得多。
【解决方案2】:

对于忽略文件夹的问题,可以使用git check-ignore,并测试错误码。

$ cd ~/project
$ git check-ignore tracked-folder
$ echo $?
1
$ git check-ignore ignored-folder
ignored-folder
$ echo $?
0

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

【讨论】:

    【解决方案3】:

    您可以使用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. per-directory .gitignores, 2. global gitignore file, 3. .git/info/exclude, 4. "!exclusion" 模式。
    猜你喜欢
    • 2023-04-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 2021-08-09
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多