用于跨分支和 Git 存储库中的历史记录进行搜索的工具

用于跨分支和 Git 存储库中的历史记录进行搜索的工具

我正在寻找一个工具,或者对脚本的建议,它能够根据文件名和文件内容(类似find/ grep)在 Git 存储库中搜索文件。它不仅需要能够在当前签出的分支中进行搜索,而且还需要能够搜索该分支的历史记录以及其他分支。

我拥有的 Git 存储库的一个非常具体的示例是签出dspinellis'unix-history-repo。我经常在那里寻找事物的历史实现,但是跟踪文件很痛苦,因为我经常需要猜测我需要查看哪个分支(该存储库中有 165 个分支)。

我想用这个工具做的事情的例子是为了找到wow命令,如果它作为某些早期 BSD Unix 的一部分存在(如果它存在的话),它可能是一个外部命令sh或一个内置命令。csh为此,我希望在 dspinellis 的 Git 存储库的 165 个分支中搜索wow.*文件名模式,以及可能在某个时刻包含 C 函数的文件。wow

答案1

呵呵,猜猜我也做了什么……

要在所有分支中查找文件名,我使用

git log --all --name-only --pretty=format:%H -- wow\*

wow可以用任何 glob 替换。这在 Unix 历史存储库上运行得相当快。该格式显示了导致创建匹配文件的哈希值,因此您可以在此时检查树并进一步探索。

要跨所有分支搜索文件内容,我使用

git rev-list --all | xargs git grep "excited too"

它列出了所有提交对象并搜索它们。这在 Unix 历史存储库上非常非常慢;列出所有分支并在那里进行 grep 会更快:

git grep "excited too" $(git branch -r | awk '{print $1}')

相关内容