在Git代码库中,我想列出包含某个单词的所有提交。我试过了
git log -p | grep --context=4 "word"
但它不一定会返回文件名(除非它与我搜索的单词相距不到五行。我也尝试过
git grep "word"
但它只给了我目前的档案,而不是历史。
如何搜索整个历史,以便跟踪特定单词的变化?我打算在我的代码库中搜索单词的出现,以跟踪更改(在文件历史中搜索)。
在Git代码库中,我想列出包含某个单词的所有提交。我试过了
git log -p | grep --context=4 "word"
但它不一定会返回文件名(除非它与我搜索的单词相距不到五行。我也尝试过
git grep "word"
但它只给了我目前的档案,而不是历史。
如何搜索整个历史,以便跟踪特定单词的变化?我打算在我的代码库中搜索单词的出现,以跟踪更改(在文件历史中搜索)。
当前回答
vim逃犯对于vim中的这种检查是全能的。
使用:Ggrep来完成此操作。有关更多信息,您可以安装vim逃犯并通过以下方式查找图里亚尔:help Grep。这一集:探索数字存储的历史将指导你做到这一切。
其他回答
如果你想搜索敏感数据,以便将其从Git历史记录中删除(这就是我登陆这里的原因),有一些工具可以实现这一点。GitHub作为该问题的专用帮助页面。
以下是本文的要点:
BFG Repo Cleaner是git过滤器分支的一种更快、更简单的替代方法,用于删除不需要的数据。例如,要删除包含敏感数据的文件并保持最新提交不受影响),请运行:
bfg --delete-files YOUR-FILE-WITH-SENSITIVE-DATA
要替换passwords.txt中列出的所有文本,请运行:
bfg --replace-text passwords.txt
请参阅BFG Repo Cleaner的文档以了解完整的用法和下载说明。
这与BFG(Git过滤器分支-不要与Git过滤器分支混淆)和Git过滤器repo结合使用非常有用。它只获取文件路径,这样您就可以将它们输入到我刚才提到的两个工具之一中。
A.相对、唯一、排序的路径:
# Get all unique filepaths of files matching 'password'
# Source: https://stackoverflow.com/a/69714869/10830091
git rev-list --all | (
while read revision; do
git grep -F --files-with-matches 'password' $revision | cat | sed "s/[^:]*://"
done
) | sort | uniq
B.唯一、排序的文件名(不是路径):
# Get all unique filenames matching 'password'
# Source: https://stackoverflow.com/a/69714869/10830091
git rev-list --all | (
while read revision; do
git grep -F --files-with-matches 'password' $revision | cat | sed "s/[^:]*://"
done
) | xargs basename | sort | uniq
第二个命令对BFG很有用,因为它只接受文件名,而不接受相对/系统绝对路径。
给你。享受这些Bash片段给我带来的痛苦。我讨厌Bash,所以我为什么要继续使用它?
解剖
仅获取文件名/路径
以下任何选项的含义相同(git rep文档):
-l级--具有匹配项的文件--仅名称
只显示包含以下内容的文件的名称,而不是显示每个匹配的行块引用
你的模式是:A.Regex v.s.B.Fixed String?
至于-F,这意味着使用固定字符串而不是正则表达式来解释模式。一个来源。
这里还有一个有用的注意事项:您可以输入-i或--ignore大小写,以便不区分大小写。
去掉那个愚蠢的前导提交散列
sed "s/[^:]*://"
来源
获取他们独特的路径!
| sort | uniq
谁想要重复路径?不是你,不是我!哦,嘿,看,它们也分类了!享受
资料来源:我。我已经用了很久了。(男尊女卑)
没有路径的文件名呢?
xargs basename
您可能会认为|basename可以工作,但不会。它不接受输入标准输入,而是作为命令行参数。这是一个解释。想想看吧basename基本上返回没有前导路径的茎文件名。男人的名字。
对于方法A,我希望绝对路径而不是相对路径。
当然,只是在最后拍一个现实路径。像这样:
) | sort | uniq | xargs realpath
当然,您必须使用xargs,因为realpath不使用标准输入作为输入。它使用命令行参数。就像dirname一样。
激励
看看这个很棒的替代答案。在所有Git历史记录中搜索字符串仅使用Git grep的文件名
gitlog的鹤嘴锄将通过gitlog-Sword查找包含“word”在内的更改的提交
vim逃犯对于vim中的这种检查是全能的。
使用:Ggrep来完成此操作。有关更多信息,您可以安装vim逃犯并通过以下方式查找图里亚尔:help Grep。这一集:探索数字存储的历史将指导你做到这一切。
经过大量实验,我可以推荐以下内容,其中显示了引入或删除包含给定正则表达式的行的提交,并显示每个行中的文本更改,颜色显示添加和删除的单词。
git log --pickaxe-regex -p --color-words -S "<regexp to search for>"
需要一段时间才能运行…;-)