我想創建一個zsh小部件來執行一個按鈕的版本控制系統的常見任務。例如。如果當前目錄是Subversion簽出的一部分,按F1應該調用「svn status」。如果它在git倉庫中,它應該調用「git status -s」。zsh:找出當前目錄的VCS
現在,創建小部件並沒有什麼大不了的。但是,如何確定當前目錄中的哪個VCS?
我知道約vcs_info
,我用了很多。但我找不到任何方法來檢索最基本的信息,它提供了。有任何想法嗎?
我想創建一個zsh小部件來執行一個按鈕的版本控制系統的常見任務。例如。如果當前目錄是Subversion簽出的一部分,按F1應該調用「svn status」。如果它在git倉庫中,它應該調用「git status -s」。zsh:找出當前目錄的VCS
現在,創建小部件並沒有什麼大不了的。但是,如何確定當前目錄中的哪個VCS?
我知道約vcs_info
,我用了很多。但我找不到任何方法來檢索最基本的信息,它提供了。有任何想法嗎?
感謝所有的評論。我的解決方案,現在看起來是這樣的:
vcs-status() {
setopt no_autopushd
cmd=""
cur_dir=`pwd`
while [[ `pwd` != "/" ]]; do
if [[ -d .svn ]]; then
cmd="svn status^M"
break
elif [[ -d .git ]]; then
cmd="git status -s^M"
break
fi
cd ..
done
cd $cur_dir
if [[ -n $cmd ]]; then
zle -U $cmd
fi
setopt autopushd
}
zle -N vcs-status
bindkey "\eOP" vcs-status
建議冷卻zsh'ish改進,歡迎:-)
我還實施托馬斯的建議,用svn info
和git rev-parse
。但後來我注意到一個問題:如果我有一個SVN工作副本檢出裏面一個GIT工作副本(是的,這是必要的),反之亦然,我只能找到我檢查的第一個。通過上面的解決方案,我發現了「最內層」,這正是我想要的。事實上,這是一個令我討厭vcs_info
一段時間的問題。
如何測試特定元數據目錄的存在?
if test -d CVS; then
# CVS
elif test -d .hg; then
# Mercurial
elif test -d .git; then
# Git
elif test -d .svn; then
# Subversion
else
# unknown
fi
嗯,我不確定它是否那麼簡單。在git中只有根目錄下有.git目錄,但沒有在任何子目錄中(我也聽說過SVN的更新版本)。我會搜索所有父目錄。當然,這也沒有什麼大不了的,但我希望'vcs_info'能提供一個函數或變量(我找不到)。 –
好吧,我想我會隨你的解決方案(和提到的改進)。謝謝! (如果在不久的將來沒有更好的東西出現,我會接受你的答案) –
'svn info'在子目錄中工作(* it *搜索以查找'.svn'目錄)。 'git'同樣靈活。如果腳本被修改以測試相應工具的非錯誤輸出,它將執行OP所要求的操作。 –