Как я могу сделать порядок журнала git на основе временной метки автора?

Я использую довольно сложную команду git-log, включающую --date-order, чтобы получить обзор состояния моего репозитория; но, к сожалению, --date-order, похоже, использует дату коммитатора, а не дату автора. Это означает, что каждый раз, когда я обновляю свои тематические ветки, перемещая их на текущую восходящую ветвь, я теряю полезный хронологический порядок в моих git-log относительных коммитах в моих тематических ветвях (то есть каждая ветвь становится одной длинной строкой, потому что все его коммиты были перебазированы на последовательные и почти идентичные временные метки коммиттера.)

Если бы я мог заставить git-log упорядочивать коммиты по временной метке автора вместо временной метки committer, это было бы решено. Кто-нибудь знает способ сделать это?


Для тех, кто посещает это из результатов Google, вы можете изучить решение josephdpurcellподробный пост в блоге!), ниже. Это очень хорошо, если вы ищете стандартный вывод в стиле git-log, многострочный, с подробными сообщениями о каждом коммите.

К сожалению, теперь мне нужно изменить этот вопрос, потому что я идиот и не предоставил более конкретной информации о моем прецеденте: я использую git-log в «режиме --graph», и мне нужно сделать git-log себя < /strong> работать в порядке автор-дата-дата. Насколько мне удалось установить, это совершенно невозможно сделать извне git-log, потому что git-log сама занимается упорядочением и печатью графов.

Скрипт или патч для git-log может понадобиться, кажется. Я оставлю это открытым до тех пор, пока кто-нибудь не сможет либо 1. написать такой сценарий, либо 2. мы сможем уговорить git авторов включить --author --date-order комбинацию флагов. знак равно


Для справки, вот мои текущие функции glog. вывод выглядит так, и что мне нужно изменить порядок:

вывод лога


person ELLIOTTCABLE    schedule 20.12.2011    source источник


Ответы (4)


git версии 1.8.4 добавил аргумент --author-date-order к git log; согласно примечаниям к выпуску, "вывод топологически отсортирован, а коммиты в параллельных историях показаны перемешанными вместе на основе временной метки автора».

person M Somerville    schedule 18.09.2013
comment
Хе. На самом деле я проделал здесь большую работу (после публикации этого вопроса), но не осознавал, что его когда-либо очищали и добавляли в основную линию. Прохладный! Спасибо за предупреждение. Я проверю, что это действительно решает мою настоящую, исходную проблему, а затем, вероятно, приму этот ответ. - person ELLIOTTCABLE; 19.09.2013
comment
У меня была такая же (или очень похожая) проблема, и добавление этого к моему псевдониму журнала делает его гораздо более читабельным. Спасибо! - person zshift; 06.06.2017

Ладно, мне потребовалось очень много времени, чтобы разобраться (подробности). Короче говоря, я нашел много примеров, которые были либо неполными, либо неправильными. Следующая команда делает то, что, как я думаю, вы ожидаете:

$ git log --pretty="format:%at %C(yellow)commit %H%Creset\nAuthor: %an <%ae>\nDate: %aD\n\n %s\n" | sort -r | cut -d" " -f2- | sed -e "s/\\\n/\\`echo -e '\n\r'`/g" | tr -d '\15\32' | less -R

Этот и другие скрипты можно найти в разделе Git Extras на GitHub.

person josephdpurcell    schedule 15.01.2013
comment
+1 Да! простой и сладкий. А также +1 за объяснение всего блога. - person Alexander Bird; 15.03.2013
comment
И если вы хотите превратить это в псевдоним: alias prettylog=git log --pretty='format:%at %C(yellow)commit %H%Creset\nAuthor: %an <%ae>\nDate: %aD\n\n %s\n' | sort -r | cut -d' ' -f2- | sed -e 's/\\\n/\`echo -e '\n\r'`/g' | tr -d '\15\32' | less -R" - person Druska; 15.04.2013
comment
На самом деле я искал предшественника из вашего решения (я настраиваю однострочный журнал, поэтому все многострочные и tr бессмысленные были для меня неуместны) … но поскольку вы сжали все свои исследования в сообщение в блоге (вы хитрый дьявол!), я смог использовать одно из твоих предыдущих воплощений. Лучший ответ, который я когда-либо получал от S.O.; Хотел бы я дважды проголосовать за вас. знак равно - person ELLIOTTCABLE; 28.05.2013
comment
Я был очень взволнован этим решением, пока не понял, что оно не поддерживает --graph, что полностью противоречит моей цели. Без --graph я не вижу структуру своей истории, что делает git-log в целом бесполезным для меня. ›: - person ELLIOTTCABLE; 28.05.2013

--date-order/--topo-order на самом деле просто контролирует порядок коммитов в списке ревизий, когда вы просматриваете несколько веток, работающих рядом с другой. Отношение «x является родителем y» всегда соблюдается, даже если временная метка вашего коммиттера/автора относится к далекому прошлому или будущему.

Вам понадобится что-то вроде git log --pretty="format:%at %H" | sort -g, а затем передать хэши обратно в git log.

person jørgensen    schedule 20.12.2011

На основе того, что предложил Йоргенсен, есть «однострочное» решение, которое может дать вам то, что вы ищете. Отформатировано здесь для удобства просмотра. Улучшения приветствуются!

SORTED_GIT_LOGS=$(git log --pretty="format:%at %H" | sort -g | cut -d' ' -f2); \
    IFS=$(echo -en "\n\b"); for LOG in $SORTED_GIT_LOGS; do \
        git show --name-only $LOG; \
    done | less
person Nate    schedule 02.10.2012