Как изменить порядок вывода веток git

Когда я набираю git branch, я получаю список ветвей, которые, похоже, отсортированы по алфавиту, а не по времени их создания.

Есть ли способ сделать вывод git branch отсортированным по дате?


person WinWin    schedule 08.07.2011    source источник
comment
Дубликат stackoverflow.com/questions/5188320/ и stackoverflow.com/questions/2514172/   -  person joeln    schedule 10.12.2013


Ответы (3)


Изменить

Увы, есть очевидные проблемы с вариантами сортировки, используемыми git-for-each-ref. Поскольку эта команда (очевидно) явно направлена на отображение refs и принимает параметр --sort, я считаю это вероятной ошибкой [1].

Вот лучшие варианты, которые я могу придумать дальше, но вывод довольно сильно отличается от исходного формата (потому что они полагаются на украшение ревизий постфактум для ссылки на ветки). Ну что ж, может быть, вам это пригодится:


[1], если бы это было git-rev-list или git-log, я бы подумал, что проблема в том, что мы на самом деле не идем по дереву ревизий; мы активно стараемся показывать только кончики деревьев, не выгуливая их.

Временная альтернатива

git log --no-walk --date-order --oneline --decorate \
       $(git rev-list --branches --no-walk)

Это даст вам список, похожий на

4934e92 (HEAD, origin/testing, origin/HEAD, testing) reviewed INSTALL file as per #1331
6215be7 (origin/maint, maint) reviewed INSTALL file as per #1331
1e5e121 (origin/emmanuel, emmanuel) buffers: adjust the size in zfsfuse_stat
e96783e (origin/compress, compress) buffers: adjust the size in zfsfuse_stat
f6e2c6c (origin/unstable, unstable) revert the fatal condition again
dd52720 (origin/master-lucid, master-lucid) lucid
3b32fa7 (tag: 0.7.0, origin/master, master) panic revocation of 0.7.0-0 package necessitates an update
6eaa64f (origin/maint-0.6.9, maint-0.6.9) Replace remount by drop_caches (on rollback)

_Как видите, результат может быть немного ошеломляющим при наличии множества удаленных (отслеживающих) ветвей, которые фактически являются псевдонимами одних и тех же ревизий. Однако результат правильно отсортирован по дате (по убыванию).

Правильный (к сожалению, сломанный?) Подход

Нет, но ты должен уметь

git for-each-ref --sort='-*committerdate' --format="%(refname:short)" refs/heads/

(используйте --sort='-*authordate' для упорядочивания даты автора)

В моем тестовом репо это дает:

compress
emmanuel
maint
maint-0.6.9
master
master-lucid
testing
unstable

Псевдоним

для этого вы можете создать псевдоним git: добавьте следующие строки в .git/config

[alias]
branch2 = git for-each-ref --sort='-*committerdate' --format="%(refname:short)" refs/heads/

С этого момента вы можете просто сказать git branch2

person sehe    schedule 08.07.2011
comment
Это отличный ответ! Уже +1. Однако у меня это почему-то не работает. Однако он сортирует их иначе, чем git branch. Есть идеи, в чем может быть проблема? - person WinWin; 09.07.2011
comment
Совет по псевдониму .git / config примечателен. Я пробовал --sort='-*authordate' и --sort='-*taggerdate', но, похоже, ни один из них не справляется с задачей сортировки по времени. - person WinWin; 09.07.2011
comment
@WinWin, вы хотите, чтобы они были отсортированы по времени создания или по времени последнего внесения? Я не уверен, что первое будет так легко получить. - person ebneter; 09.07.2011
comment
@WinWin, я согласен, похоже, что-то мешает правильной работе порядка сортировки. Я обновлю свой ответ соответственно - person sehe; 09.07.2011
comment
@ebneter На данный момент подойдет любой вариант. Но у меня ничего из этого не работает. - person WinWin; 09.07.2011
comment
@ebetner: Сортировка по времени создания ветки в целом не просто сложна, но и невозможна. Если создание ветки выходит за рамки рефлога (по умолчанию 90 дней), это все, что вы сможете увидеть. - person Cascabel; 09.07.2011
comment
@sehe Ваша временная альтернатива работает отлично. Да, вывод более подробный, чем git branch, но я всегда могу использовать cut или sed, чтобы получить желаемое форматирование. Спасибо! - person WinWin; 09.07.2011
comment
@sehe Например, я могу получить довольно похожий результат, пропустив ваш вывод через | cut -d " " -f 2. - person WinWin; 09.07.2011
comment
@sehe И | cut -d "(" -f 2 | cut -d ")" -f 1 работает даже лучше. :) - person WinWin; 09.07.2011
comment
@sehe Еще одно преимущество вашей временной альтернативы: она также включает теги - и по порядку! (как и gitk) - person WinWin; 11.07.2011
comment
@WinWin: угадай, что использует gitk (кроме git show-branch) :) - person sehe; 11.07.2011
comment
Этот ответ больше не актуален, поскольку в ответе stunjo есть мертвое простое решение - person electrovir; 07.11.2019

Начиная с git 2.7.0 это будет работать:

git branch --sort=-committerdate
person stujo    schedule 26.02.2019
comment
Думаю, это более точный ответ на этот конкретный вопрос. - person paul; 05.02.2021

Ответ Stujo - мой любимый, но я хотел пойти еще дальше и сделать сортировку по дате коммиттера своим поведением по умолчанию git branch. Вот как:

git config --global branch.sort -committerdate

Удалите - перед committerdate, чтобы выполнить другую сортировку.

Теперь git branch всегда будет сортироваться по дате!

person electrovir    schedule 13.06.2019