簡體   English   中英

列出當前 git 分支歷史記錄中任意位置的子目錄中的文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM