2009-10-20 70 views
2

如何列出git倉庫中所有文件的所有版本?如何獲得Git倉庫中所有blob的列表

(例如上市是有史以來包含某些字符串的所有文件)

這個列表可以用來貓的文件。

+0

這可能是解決方案git rev-list --all | xargs -l1 git diff-tree -r -c -M -C --no-commit-id | awk'{print $ 3}' – Hugo 2009-10-20 15:55:48

+0

@ Hugo:是的,那會給你一個blob列表。然而,你需要做更多的工作 - 你還需要記住文件名字段,這樣當你「顯示」一個blob時,你就可以將它重新命名爲名稱。你也已經失去了一些重要的信息:blob的一部分是什麼。 – Cascabel 2009-10-20 16:03:58

+0

@Hugo:另一個想法 - 因爲你使用的是差異樹,所以你只能看到修改過的斑點,所以如果你想通過這些修改斑點,你真的接近'git log -S「的功能。 – Cascabel 2009-10-20 16:07:11

回答

2

首先,你很少有機會通過列出blob來做到這一點。 blob只是原始數據;它不知道它是什麼文件的一部分。真正的答案取決於你想要完成什麼。例如,是否需要搜索提交歷史記錄中無法訪問的提交的一部分的blob?如果你不這樣做,這裏有一些想法。

也許鎬頭搜索git-log會做你想要什麼:

-S<string> 查找以引進或刪除的<string>一個實例的差異。請注意,這與簡單出現在diff輸出中的字符串不同。請參閱gitdiffcore(7)中的鎬條目瞭解更多詳情。

根據您的最終目標,這可能比您建議的要好 - 您會看到字符串是如何添加或刪除的。如果您願意,您當然可以使用您獲得的信息來捕捉整個文件。

或者您可能想要列出git-log的修訂版,並使用它提供的樹(提交)上的git-grep

6

這是我得到的SHA和文件名的列表中的一個庫中的所有斑點:

$ git rev-list --objects --all | git cat-file --batch-check='%(objectname) %(objecttype) %(rest)' | grep '^[^ ]* blob' | cut -d" " -f1,3- 

注:

  1. 格式字符串的%(rest)原子追加其餘將對象的SHA之後的輸入行輸出到輸出。在這種情況下,這個休息恰好是路徑名(對於樹和blob對象)。

  2. grep模式旨在僅匹配實際斑點,而不是僅在其路徑名中的某處存在字符串blob的樹對象。

相關問題