2016-09-27 56 views
0

我有一個文件,我認爲可能是在一個git回購。我目前在我的主目錄中。如何在不更改當前工作目錄的情況下獲取回購的頂級目錄?只有瞭解回購協議中的單個文件,才能獲得git回購的最高級別?

如果我在回購裏面,我可以運行獲取根目錄。

(~/code/dir1) $ git rev-parse --show-toplevel 

實際上,我希望能夠使用文件直接找到git目錄的根目錄。

(~) $ find . -name "specific_file.py" 

凡樹的重要的部分是:

~/code/dir1/.git 
~/code/dir1/files/more_files/specific_file.py 

是否有這樣做的git的方式,或者是通用的外殼操縱這樣做的最佳方式?

我知道我可以做:

(~) $ cd $(dirname $(find . -name "specific_file.py")) 
(~/code/dir1/files/more_files) $ git rev-parse --show-toplevel 
~/code/dir1 
(~/code/dir1/files/more_files) $ cd - 

如果我嘗試沒有被回購裏面我得到的消息:

Fatal '~/code/dir1/files/more_file/specific_file.py' is outside repository 

如果我試圖和git的目錄設置爲進一步被向下樹:

git --git-dir=$(dirname $(find . -name "specific_file.py")) rev-parse --show-toplevel 

它告訴我,我不是在一個git目錄中工作。

我也嘗試過使用工作樹,但這似乎並不是我之後直接在路徑上直接查找/.git目錄。

+0

我不確定我是否理解需要做什麼。不會'find'顯示文件的完整路徑,從中可以明顯看出它是否位於Git倉庫中? –

+0

你在哪個平臺上? – pneumatics

+0

@TimBiegeleisen是的,因爲我知道我的機器上的回購結構,但似乎沒有一種簡單的方法來查找根路徑,以便從源代碼構建它時可以找到其他幫助程序腳本。我當然可以將路徑作爲參數,但是如果有一個簡單的解決方案內置於git中,我想避免這種情況。 –

回答

2

詳細閱讀man頁面後,這是-C標誌我需要的不是--git-dir--work-dir標誌。

git -C $(dirname $(find . -name "specific_file.py")) rev-parse --show-toplevel 

我的理解是,如果與子模塊/子樹工作的多個-C標誌可能是有用的。

從git的手冊頁:

運行彷彿git的在代替當前的工作目錄 開始。當給出多個-C選項時,每個後續的非絕對-C相對於前面的-C 進行解釋。

此選項會影響期望路徑名稱的選項,例如--git-dir和 --work-tree,因爲它們將對路徑名稱的解釋相對於由-C選項引起的工作目錄做出。對於 示例以下調用是等效的:

+0

哦,你去了! – pneumatics

1

嘗試更改子shell中的目錄,然後致電git rev-parse --show-toplevel。你會馬上回到你想要的信息!

注意:$OSTYPE迴轉是由於在OSX附帶的readlink的BSD版本中沒有-f|--canonicalize標誌。在osx上的替代方法是brew install greadlink並設置一個局部變量,如readlink=$(command -v greadlink readlink | head -n 1),然後調用${readlink} -f

abspath() 
{ 
    case $OSTYPE in 
     darwin*) python -c 'import sys, os.path; print os.path.abspath(sys.argv[1])' $1;; 
     linux*) readlink -f $1;; 
    esac 
} 

topgit() 
{ 
    [ -e "$1" ] || { echo >&2 "$1 does not exist"; return 1; } 
    abspath=`abspath $1` 
    (
    [ -f "$abspath" ] && cd `dirname $abspath` || cd $abspath 
    git rev-parse --show-toplevel 
    ) 
} 
+0

我不認爲安裝'greadlink'對於那麼小的事情是一個公平的依賴。子外殼組件意味着我不擔心目錄更改。有沒有任何git內建/標誌/ env_var直接做到這一點? –

+1

是的,缺少'readlink -f'是osx上的一個隱藏者。你可以強制呼叫者提供絕對路徑,但這並不好玩。我已經使用了Python或Perl單行代碼作爲替代品,作爲一種不需要安裝'greadlink'的便攜式解決方案,但在某種程度上這更加愚蠢。但它會工作,想要解決方案? – pneumatics

+1

不錯,我經常用'python -c「import os.path as p; print(p.realpath($ 1))」'作爲替代。 –

相關問題