2013-12-09 70 views
1

我需要一種方法來列出在我的資源庫根目錄中存在的所有目錄。我需要他們從每個分支和標籤。Git:列出回購根目錄下的所有目錄

例如:
我目前的回購在主分支的根目錄有20個目錄。在我們的開發分支上,曾經有一個名爲「lib」的目錄。此目錄已被刪除。我需要一個列出這個「lib」文件夾的命令,以及在其分支的當前提交中可能存在或可能不存在的所有其他目錄。我需要他們。

我試過「rev-list」,但它似乎只給出當前分支的結果。

+0

你試過用'git whatchanged --pretty = oneline --remote'嗎? – onionpsy

+0

不知道我明白。什麼是「whatchanged」應該是什麼? – epb

+0

他字面意思是'git whatchanged'。這實際上是一個比我的建議快得多的執行的好建議,但它確實依賴porcelain命令,並且需要稍微更復雜的輸出分析。 –

回答

2

您可以使用git cat-file -p打印樹對象的內容,並且commit^{tree}表示法提取提交的樹對象,即可以說git cat-file -p HEAD^{tree}列出當前提交的根目錄內容。使用git rev-list --all獲取所有提交的SHA-1,並過濾除樹對象之外的任何內容。

while read commit ; do 
    git cat-file -p $commit^{tree} 
done < <(git rev-list --all) | awk '$2 == "tree" { print $4 }' | sort -u 

如果您的存儲庫很大,您可以期待這需要一些時間。我用git.git(37k提交)嘗試了它,並且用了大約四分鐘的時間纔得到一個熱緩存。如果您的目錄名稱中有空格,則必須調整過濾器。

+0

似乎是「完成」之後第3行的語法錯誤。 (我使用cygwin,如果這很重要。) – epb

+1

你使用的是什麼shell?你的shell可能不喜歡路徑替換('<(git ...)')。該命令在bash和zsh(在Linux上)都正常工作。你可以試試這個:'git rev-list --all |而讀取提交;做git cat-file -p $ commit^{tree};完成| awk'$ 2 ==「tree」{print $ 4}'|排序-u'。 –

+0

我正在使用cygwin(實際上是git bash)。第二個命令很好,除了我得到一個異常:STATUS_ACCESS_VIOLATION。不過,它看起來仍然有相當完整的產出。 – epb

相關問題