我正在寻找一个工具,或者对脚本的建议,它能够根据文件名和文件内容(类似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}')