我曾经删除过一个文件或文件中的一些代码。我可以在内容(而不是提交消息)中进行grep吗?
一个非常糟糕的解决方案是grep日志:
git log -p | grep <pattern>
然而,这不会立即返回提交哈希。我和吉特·格里普玩得不亦乐乎。
我曾经删除过一个文件或文件中的一些代码。我可以在内容(而不是提交消息)中进行grep吗?
一个非常糟糕的解决方案是grep日志:
git log -p | grep <pattern>
然而,这不会立即返回提交哈希。我和吉特·格里普玩得不亦乐乎。
当前回答
Jeet的答案在PowerShell中有效。
git grep -n <regex> $(git rev-list --all)
下面显示了任何提交中包含密码的所有文件。
# Store intermediate result
$result = git grep -n "password" $(git rev-list --all)
# Display unique file names
$result | select -unique { $_ -replace "(^.*?:)|(:.*)", "" }
其他回答
git rev-list --all | xargs -n 5 git grep EXPRESSION
是对Jeet解决方案的一个调整,因此它在搜索时显示结果,而不仅仅是在最后(在大型存储库中可能需要很长时间)。
为了简单起见,我建议使用GUI:gitk——Git存储库浏览器。它很灵活
要搜索代码:要搜索文件,请执行以下操作:当然,它还支持正则表达式:
您可以使用向上/向下箭头浏览结果。
在git历史记录中搜索的命令
git log -S"alter" --author="authorname" --since=2021.1.1 --until=2023.1.1 -- .
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很有用,因为它只接受文件名,而不接受相对/系统绝对路径。
在这里查看我的完整答案以了解更多解释。
场景:您使用IDE对代码进行了大清理。问题:IDE清理的比它应该清理的多,现在代码无法编译(缺少资源等)
解决方案:
git grep --cached "text_to_find"
它将找到更改“text_to_find”的文件。
现在可以撤消此更改并编译代码。