В силу определённых обстоятельств — периодически стал возникать вопрос, в каких временных рамках я занимался тем или иным проектом. И готового ответа на него у меня не было — как-то не приходило в голову фиксировать подобную информацию.
Но есть же git
— ведь он поможет? Ведь поможет, да?
Git поможет!
Возникла тривиальная идея — вытащить эту информацию из гит-лога. Первый и последний коммиты — плюс-минус дадут требуемые рамки. Достаточно найти все коммиты определённого автора (в данном случае — себя) и взять первый+последний.
Git alias для поиска по автору
Чтобы не запоминать (или не искать в истории) довольно длинную команду — её удобно запихать в пользовательский alias (именно гита, не оболочки). Например — в ~/.gitconfig
прописать (в секции [alias]
):
[alias]
first-last-by-author = "!f() { \
LOG=$(git log --pretty=format:\"%h%x09%an%x09%ad%x09%s\" --date=short --author=\"${1}\"); \
FIRST=$(echo \"${LOG}\" | head --lines=1); \
LAST=$(echo \"${LOG}\" | tail --lines=1); \
echo \"${FIRST}\"; echo \"${LAST}\"; \
}; f"
В частном случае — это уже работает достаточно удобно и выглядит примерно так:
user@host:~/single-repo$ git first-last-by-author dmitry f887e8aa55 Dmitry 2022-06-26 6f7a97ded7 Dmitry 2021-04-08
Когда репозиторий для поиска — один. Или парочка. Или… Нет, когда их парочка сотен — становится грустно. Идея явно требует развития!
One Function to find them all
Для решения задачи поиска по набору репозиториев — пришлось воспользоваться функциями оболочки. Они у меня сложены в отдельном файле ~/.config/bash/bash_functions
.
На базе команды для обновления репозиториев и приведённого выше гит-алиаса для поиска по автору — сделал такую вот bash-функцию:
git-first-last-commit-by-author() {
export GIT_SEARCH_AUTHOR_NAME="${1}"
LOG=$(find . -type d -name '.git' | xargs -n1 -- \
sh -c 'cd "${0}/.." && git first-last-by-author "${GIT_SEARCH_AUTHOR_NAME}" | sed "/^[[:space:]]*$/d"' \
| sort --key=4,4 \
)
unset GIT_SEARCH_AUTHOR_NAME
echo "${LOG}" | head --lines=1
echo "${LOG}" | tail --lines=1
}
Теперь поиск работает и в общем случае (в каталоге multi-repo
лежит куча git-репозиториев):
user@host:~/multi-repo$ git-first-last-commit-by-author dmitry 8f1d4ae Dmitry 2022-08-16 83a8f89c Dmitry 2023-02-15
Видно, что здесь порядок сортировки по датам — прямой. Мне так удобней, но всегда можно использовать ключ --reverse
для sort
внутри git-first-last-commit-by-author()
.