[英]List the files in a sub-directory present at any point in the current git branch's history
要在特定提交中列出子目錄中存在的所有文件,我可以簽出該提交並查看文件。 有沒有辦法列出在任何時候(即在當前提交的祖先中的任何提交中)存在於子目錄中的所有文件?
是: git ls-tree
接受所謂的“tree-ish”和可選路徑(如果未指定,則默認為存儲庫根目錄)。
樹形是可以解析為樹的任何東西——一個 object,它將有關單個“目錄”的信息存儲在記錄的提交中。
提交總是指精確的單個樹 object,而樹 object 可能引用零個或多個其他樹對象 - 表示“子目錄”。
因此,提交始終是一個空洞的“樹狀”。
TL;博士
要獲取/foo/bar
前綴下的文件列表,三個提交回調調用
git ls-tree HEAD~2 foo/bar
更新以反映對原始問題的澄清
但我想要所有提交中的文件,即 HEAD、HEAD~、HEAD~2、HEAD~3、HEAD~4,…… 回到整個歷史記錄。 也許我的問題不清楚?
可以使用一點 shell 腳本來滾動:
git rev-list HEAD | while read sha; do
git ls-tree -r "$sha" prefix/of/interest;
done
…它基本上遍歷從HEAD
可訪問的 DAG 中的所有提交,並為每個提交調用git ls-tree
並帶有提交的名稱和感興趣的前綴(目錄名稱)。
請注意,如果特定提交中不存在前綴樹 object ,則git ls-tree
以非零退出代碼退出,因此如果要在set -e
下運行此代碼,則應確認並補償.
這種方法可能會以許多有趣的方式進行升級。
例如,可能不只是獲取文件列表或調用諸如git show --name-status $sha
之類的東西。
Ionică Bizău 對另一個問題的回答(“如何使用 git 日志僅獲取帶有路徑的文件名?”)給了我一些可以使用的東西。 這似乎可以在導致當前 state 的所有提交中獲取/foo/bar
目錄下曾經存在的所有文件:
git log --name-status -- /foo/bar | grep -E '^[A-Z]\b' | sed -e 's/^\w\t*\ *//' | sort | uniq
git log --name-status
給出了所有提交中更改的所有文件的名稱和狀態( 文檔)。-- /foo/bar
將日志限制到感興趣的目錄(這里)|
bash 管道( 文檔)grep -E '^[AZ]\b'
獲取以 ( ^
) 大寫字母 ( [AZ]
) 后跟分詞符 ( \b
) 開頭的行,即以 M、D、A、.. 開頭的行..( grep 文檔和差異過濾器文檔)sed -e 's/^\w\t*\ *//'
在s/regexp/replacement/
上運行 stream 編輯器/ 在這種情況下^\w\t*\ *
查找以 ( ^
) 開頭的帶有單詞 ( \w
)后跟零個或多個制表符( \t*
),然后是零個或多個空格( \ *
)並將這些匹配項替換為空字符串( sed 文檔)sort
( 文檔)uniq
( 文檔)(注意此解決方案不包括添加到工作樹或階段但尚未提交的文件,因此請先添加並提交。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.