Вам придется самостоятельно анализировать вывод git-log; нет встроенного способа сделать это. Сложно иметь дело с слияниями. Если бы у вас была линейная история, это было бы очень быстро - используйте вывод git log --pretty="$H $at"
напрямую (это печатает полный хэш и метку времени UNIX). Однако, если у вас есть слияния, нет способа всегда заканчивать каждым коммитом, за которым сразу следует тот, с которым вы хотите сравнить.
Тогда очевидный подход заключается в поиске родительского времени для каждого коммита в отдельности. Конечно, довольно неэффективно делать дополнительный вызов в git log для каждого коммита, вместо того, чтобы разумно их запоминать, но код наверняка короче. Вот что я придумал как однострочник bash:
git log --no-merges --pretty="%H %at" |
while read line; do
time=${line#* }
commit=${line% *}
parent_time=$(git log --no-walk --pretty=%at $commit^)
dt=$((time - parent_time))
if [ $dt -lt 60 -a $dt -gt -60 ]; then
# modify this log format to whatever you like
git log --no-walk --pretty="%H %an %s" $commit
fi
done
Это не так ужасно медленно, поэтому, если вы не хотите делать это так много, это, вероятно, достаточно хорошо. Вы также должны проверить всю дорогу до начала хранилища только один раз; после этого вы можете ограничить начальный журнал git --since
.
Вы заметите, что я ограничил разницу во времени между + -60 секундами. Вполне возможно, что он будет отрицательным, если произошел ребаз; Вы, вероятно, все еще хотите заметить, если кто-то быстро сделал два коммита, а затем поменял их местами, поэтому я включил отрицательные значения.