如何在git仓库中列出所有当前的待办事项信息?

26

我想查看所有仅由我编写且存在于当前Git管理的代码库中的TODO注释。

到目前为止,我的做法是打印我在整个Git历史中创建或修改过的所有TODO注释:git log -p --author="My name" -S TODO | grep "\+.*TODO"

但这个工具链会列出所有曾经编写的TODO注释,即使我已经解决了它们并从代码中删除了它们。

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

5个回答

30
你可以将git blame与grep结合使用。
像这样(不是最好的,但应该可以工作)
git grep -l TODO | xargs -n1 git blame | grep 'Your name' | grep TODO

改进版可以将首次grep找到的行号与git blame仅显示给定行的能力相结合。


4
我稍微优化了一下:git grep -l TODO | xargs -n1 git blame | grep $(git config user.name) | grep TODO。现在我可以在每台机器上使用相同的别名。因为我的工作和私人账户使用不同的用户名。/cc @lars-blumberg - DerZyklop
1
使用 git blame 这种方式将获取您重新格式化的任何 TODO(例如通过更改缩进),而不仅仅是您开始的 TODO。您真正想要做的是一些 git pickaxe (git log -S) 和 blame 的组合。 - C S
为什么 Git 没有更简单的方法来做这件事? - ScipioAfricanus

19
我希望对 aragaerKyle 的解决方案进行补充:
  • 使用 grep config 命令获取你的姓名
  • 显示 TODO 注释所在的文件名和行号
  • 删除提交 SHA、作者姓名和提交时间戳
git grep -l TODO | xargs -n1 git blame -f -n -w | grep "$(git config user.name)" | grep TODO | sed "s/.\{9\}//" | sed "s/(.*)[[:space:]]*//"

这会打印出:

Cpp/CoolClass.cpp 123 //TODO: 我们真的需要这个吗?
Cpp/AnotherClass.cpp 42 //TODO: 我们漏掉了一些东西吗?
Java/MyListener.java 23 //TODO: 优化

1
这很棒,除了它显示不存在的文件。(与@aragaer的解决方案相同) - confiq
要搜索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:]]*//" - Ahmed Hegazy

4

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

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

4
这里有一个小建议,我刚刚遇到了一个较大的代码库和一些二进制文件。在使用xargs -ni git blame时出现了意外的信号13。我通过在最初的git grep上添加-I开关来解决这个问题。
完整错误信息如下(请谷歌): 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:]]*//"

2

使用 git config 命令来设置您的姓名:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接