如何在 git 存储库中列出我当前的所有 TODO 消息?

Posted

技术标签:

【中文标题】如何在 git 存储库中列出我当前的所有 TODO 消息?【英文标题】:How to list all my current TODO messages in a git repository? 【发布时间】:2014-09-22 05:42:22 【问题描述】:

我想查看只有我编写的并且存在于由 git 管理的当前代码库中的所有 TODO cmets。

What I've got so far 正在打印我在整个 git 历史中创建或修改过的所有 TODO cmets:git log -p --author="My name" -S TODO | grep "\+.*TODO"

但是这个工具链列出了所有曾经编写过的 TODO cmets,甚至那些我已经解决并因此再次从代码中删除的内容。

什么是合适的工具链,可以逐行搜索当前代码库,检查它是否包含“TODO”以及这行是否由我编写打印这些行?

【问题讨论】:

【参考方案1】:

您可以将git blame 与 grep 结合使用。

像这样(不是最好的,但应该可以)

git grep -l TODO | xargs -n1 git blame | grep 'Your name' | grep TODO

改进的版本可能会将第一个 grep 找到的行号与 git blame 仅显示给定行的能力相结合。

【讨论】:

我对此做了一些改进:git grep -l TODO | xargs -n1 git blame | grep $(git config user.name) | grep TODO。现在我可以使用same alias on every machine。因为我有不同的用户名用于工作和私人的东西。 /cc @lars-blumberg 以这种方式使用git blame 将获得您重新格式化的所有TODO(例如通过更改缩进),而不仅仅是您开始的那些。您真正想要做的是 git pickaxe (git log -S) 和 blame 的某种组合。【参考方案2】:

我想添加 aragaerKyle 的解决方案:

使用 grep config 获取您的姓名 显示文件名和 TODO 注释的行号 删除提交 SHA、作者姓名和提交时间戳 git grep -l TODO | xargs -n1 混帐责备 -f -n -w | grep "$(git config user.name)" | grep 待办事项 | sed "s/.\9\//" | sed "s/(.*)[[:space:]]*//"

打印出来:

Cpp/CoolClass.cpp 123 //TODO: 我们真的需要这个吗? Cpp/AnotherClass.cpp 42 //TODO: 我们错过了什么吗? Java/MyListener.java 23 //TODO:优化

【讨论】:

这很好,只是它确实显示了不存在的文件。 (与@aragaer 解决方案相同) 同时搜索 FIXME git grep -lE 'TODO|FIXME' | xargs -n1 git blame -f -n -w | grep "Maya" | grep -iE 'TODO|FIXME' | sed "s/.\9\//" | sed "s/(.*)[[:space:]]*//"【参考方案3】:

完成使用git config 获取您的姓名:

git grep -l TODO | xargs -n1 git blame | grep "$(git config user.name)" | grep TODO

【讨论】:

【参考方案4】:

我发现用户名可以有空格,这样更容易通过电子邮件地址过滤。另外,@todo(小写)是我在文档块中添加注释的方式,所以我添加了“忽略小写/大写”标志。这是我的解决方案:

git grep -il TODO | xargs -n1 git blame -M  -f -e | grep -i TODO | grep $(git config user.email)

【讨论】:

【参考方案5】:

我刚刚遇到的小建议,更大的 repo 和一些二进制文件。 xargs -ni git blame 部分导致信号 13 出现意外术语。我通过在初始 git grep 上添加 -I 开关解决了这个问题。

FWIW 这是完整的错误(去谷歌)

xargs: git: terminated by signal 13

这是我使用的一个示例(也删除了我的 grep 以查看全部)

git grep -I -l TODO | xargs -n1 git blame -f -n -w | grep TODO | sed "s/.\9\//" | sed "s/(.*)[[:space:]]*//"

【讨论】:

以上是关于如何在 git 存储库中列出我当前的所有 TODO 消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何列出远程 SVN 存储库中的所有文件?

裸存储库中的 git ls-files

从 Git 存储库中删除所有标签

如何重新创作 Git 存储库中的所有提交? [复制]

如何从 Git 存储库中删除文件?

如何从 Git 存储库中删除文件?