Как перечислить все мои текущие сообщения TODO в репозитории git?

Я хочу видеть все комментарии TODO, которые написал только я и которые существуют в текущей базе кода, управляемой git.

Что я 've got so far печатает все комментарии TODO, которые я когда-либо создавал или модифицировал за всю историю git: git log -p --author="My name" -S TODO | grep "\+.*TODO"

Но в этой цепочке инструментов перечислены все когда-либо написанные комментарии TODO, даже те, которые я уже разрешил и, таким образом, снова удалил из кода.

Какова подходящая цепочка инструментов, которая может искать текущую базу кода построчно, проверять, содержит ли она «TODO», и если эта строка была написана мной, печатать эти строки?


person Lars Blumberg    schedule 30.07.2014    source источник


Ответы (5)


Вы можете комбинировать git blame с grep.

Вот так (не лучший, но должен работать)

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

Улучшенные версии могут сочетать номера строк, найденные первой командой grep, с возможностью git blame отображать только заданные строки.

person aragaer    schedule 30.07.2014
comment
Я немного улучшил это: git grep -l TODO | xargs -n1 git blame | grep $(git config user.name) | grep TODO. Теперь я могу использовать один и тот же псевдоним на каждой машине. Потому что у меня разные имена пользователей для работы и личных вещей. /cc @lars-blumberg - person DerZyklop; 13.09.2014
comment
используя git blame таким образом, вы получите все TODO, которые были переформатированы вами (скажем, путем изменения отступа), а не только те, которые вы начали. То, что вы действительно хотите сделать, это некоторая комбинация кирки git (git log -S) и blame. - person C S; 17.06.2018

Я хочу добавить решение aragaer и Kyle:

  • используйте конфигурацию grep, чтобы получить свое имя
  • отображение имени файла и номера строки комментария 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: Do we really need this?
Cpp/AnotherClass.cpp 42 //TODO: Do we miss something?
Java/MyListener.java 23 //TODO: Optimize
person Lars Blumberg    schedule 30.07.2014
comment
это здорово, за исключением того, что он показывает файлы, которые не существуют. (то же, что и решение @aragaer) - person confiq; 09.08.2015
comment
Для поиска 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:]]*//" - person Ahmed Hegazy; 13.04.2017

Я обнаружил, что имя пользователя может содержать пробелы, поэтому его проще фильтровать по адресу электронной почты. Кроме того, @todo (нижний регистр) — это мой способ добавления заметок в докблоки, поэтому я добавил флаг «игнорировать нижний/верхний регистр». Это мое решение:

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

Небольшое предложение, с которым я только что столкнулся, более крупный репо и несколько двоичных файлов. Раздел xargs -ni git blame вызывал неожиданный термин с сигналом 13. Я обошел это, добавив переключатель -I в исходный git grep.

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:]]*//"
person dedricF    schedule 11.01.2019

Завершите использование git config, чтобы получить свое имя:

git grep -l TODO | xargs -n1 git blame | grep "$(git config user.name)" | grep TODO
person Kyle Kelley    schedule 03.09.2016