我有一个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
然而,它看起来非常脆弱和脆弱。还有更好的方法吗?
答案 0 :(得分: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
,它可以清除家中的物品。
答案 1 :(得分:0)
您可以使用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'
要完成这项工作,您需要确保所有被忽略的路径都相对于您的主目录列出,并确保在依赖它之前对其进行测试,以保护您免受任何破坏性操作,例如{{1} }。
答案 2 :(得分:0)
对于忽略文件夹的问题,可以使用git check-ignore
并测试错误代码。
$ cd ~/project
$ git check-ignore tracked-folder
$ echo $?
1
$ git check-ignore ignored-folder
ignored-folder
$ echo $?
0
未跟踪的文件夹似乎具有与跟踪(但不能忽略)的文件夹相同的行为。添加-v
将向您显示哪些规则使文件夹(或文件)被忽略。