首页 > 解决方案 > 如何使用 git 进行 grep 但限制某些提交?

问题描述

假设我在 master 分支中,我只想从某些提交中 grep 单词,但这些单词仍在 master 分支中。换句话说,我想找到在某些提交中添加的那些单词并且仍然存在。

前任,

commit 76894a679551e1c9e98593219033a2cf115b163d (HEAD -> master)
   
    Change to fruit

-Apple apple dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.
+Banana apple dolor apple amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.


commit e3e0a64cf46cbe49eea17205f679e98ca213a50b

    Change to apple

-Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.
+Apple apple dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.


commit 71b609da3fe64092dd598a69e36770eb5636afec

    Init

+Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.
(END)

我想找出在 76894 中添加的苹果,所以只有引用的是我正在寻找的, Banana "apple" dolor apple amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.而不是Banana apple dolor "apple" amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.

标签: git

解决方案


认为您所需要的只是一个简单的git grep

git grep apple master

例如。该git grep命令采用可选的参数,“树”是作为快照存储在提交中的内容。

您特别要求:

在某些提交中添加的单词仍然存在

因为 Git 存储的是快照,而不是差异,所以根据定义,在任何先前的提交中添加并且仍然存在的单词在快照中

另一方面,如果您的意思是:

  • 如果出现以下情况,我想找到“苹果”:
    1. 它存在于提交 C1、C2 或 C3的文件F中,并且
    2. 它现在也存在master于文件F的尖端

那么你需要一个两遍算法:首先,检查正则表达式是否在非提示提交中的任何特定文件中匹配,然后再次检查提示提交。当且仅当您在步骤 1 和 2 中都找到它时,打印提示提交的哈希 ID(可能还有文件和匹配行)。

请注意,git grep一次可以搜索多个提交。要查看该词是否apple出现在这三个提交中的任何一个文件中,只需运行:

git grep apple C1 C2 C3

输出将包含原始提交哈希 ID,然后是文件名,然后是匹配的行:

$ git grep "go build" $(git rev-list HEAD)
f6b272b0c674c2d5022e90c3dec868af4ea26522:Makefile:      go build -ldflags "-X main.version=$$(git describe --always --dirty)"
e50f217c3e11c6ee1fb67ee720c97f4085d6c46b:Makefile:      go build

(这个特定的存储库现在非常小,Makefile在我-version支持命令之前和之后只有两个副本)。


推荐阅读