2012-05-31 150 views
3

我有一個git受控目錄(實際上是我的主目錄),其中有忽略的目錄(例如垃圾空間和由其他VCS控制的目錄)。我希望能夠讓我的bash提示符顯示一個目錄是否受版本控制,如果是這樣,通過哪個VCS,但例如git rev-parse將始終找到最上面的.git目錄。如何判斷當前工作目錄是否被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 

但是它似乎非常的hackish而脆。有沒有更好的辦法?

+4

Git不跟蹤目錄。它只跟蹤文件。 –

+0

沒錯,但我可以告訴它忽略'.gitignore'中的目錄,所以它對它們有一定的瞭解。 – ecatmur

+0

忽略.gitignore中的目錄實際上只是忽略目錄中的所有文件(具有甚至不遞歸到目錄以檢查否定模式的副作用)。 –

回答

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,它可以清除您家中的東西。

+0

太好了,謝謝。這仍然有點令人困惑(爲什麼我必須使用'pwd'而不是'.'?),但是比我更清楚。 – ecatmur

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)}\[email protected]\h:\w$(__git_ps1) [ignored]\$ " 
    else 
     PS1="${debian_chroot:+($debian_chroot)}\[email protected]\h:\w$(__git_ps1)\$ " 
    fi' 

爲了使這項工作,你需要確保你所有被忽略的路徑是相對於你的home目錄中列出,並確保依靠它來保護你不受任何破壞之前對其進行測試像rm -rf這樣的操作。

+0

不處理:1.每個目錄.gitignores,2.全局gitignore文件,3.git/info/exclude,4.「排除」模式。 –