{"id":14270,"url":"\/distributions\/14270\/click?bit=1&hash=a51bb85a950ab21cdf691932d23b81e76bd428323f3fda8d1e62b0843a9e5699","title":"\u041b\u044b\u0436\u0438, \u043c\u0443\u0437\u044b\u043a\u0430 \u0438 \u0410\u043b\u044c\u0444\u0430-\u0411\u0430\u043d\u043a \u2014 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0433\u043e\u0440\u0435","buttonText":"\u041d\u0430 \u043a\u0430\u043a\u043e\u0439?","imageUuid":"f84aced9-2f9d-5a50-9157-8e37d6ce1060"}

Git: извлечение первого и последнего комита по автору

В силу определённых обстоятельств – периодически стал возникать вопрос, в каких временных рамках я занимался тем или иным проектом. И готового ответа на него у меня не было – как-то не приходило в голову фиксировать подобную информацию.

Но есть же 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().

0
Комментарии
-3 комментариев
Раскрывать всегда