Як я можу отримати список гілок Git, упорядкований останніми комісіями?


1322

Я хочу отримати список усіх гілок у сховищі Git з "найсвіжішими" гілками вгорі, де "найсвіжіша" гілка є тією, яку було зроблено останнім часом (і тому, швидше за все, вона буде однією Хочу звернути увагу).

Чи є спосіб я використати Git для (а) сортування списку гілок за останнім фіксуванням, або (b) отримання списку гілок разом із датою останнього введення кожного в якомусь машиночитаному форматі?

Найгірший випадок, я завжди міг запустити, git branchщоб отримати список усіх гілок, проаналізувати його вихід, а потім git log -n 1 branchname --format=format:%ciдля кожної, щоб отримати дату фіксації кожної гілки. Але це буде працювати у вікні Windows, де розгортання нового процесу є відносно дорогим, тому запуск виконуваного файлу Git один раз на гілку може ставати повільним, якщо гілок багато. Чи є спосіб зробити все це за допомогою однієї команди?


2
stackoverflow.com/a/2514279/1804124 Має кращу відповідь.
Spundun

12
@Spundun, ти мене там загубив. Як комбінація декількох команд, включаючи матеріали, прокладені через perl і sed, «краща», ніж використання команди, яку Git вже має?
Джо Уайт

36
@Spundun щодо відповіді git for-each-refвід Якуба Нарбського: ви можете отримати віддалені гілки refs/remotes/замість refs/heads/(або ви можете пройти обоє, розділені пробілами); refs/tags/для тегів або просто refs/для всіх трьох видів.
jakub.g

4
Починаючи з git 2.7 (Q4 2015), не більше for-each-ref! Ви будете використовувати прямо git branch --sort=-committerdate: дивіться мою відповідь нижче
VonC

1
Можливо, дублікат stackoverflow.com/questions/9236219/…
Ondra Žižka

Відповіді:


1873

Використовуйте --sort=-committerdateваріант git for-each-ref;

Також доступний з Git 2.7.0 для git branch:

Основне використання:

git for-each-ref --sort=-committerdate refs/heads/

# Or using git branch (since version 2.7.0)
git branch --sort=-committerdate  # DESC
git branch --sort=committerdate  # ASC

Результат:

Результат

Розширене використання:

git for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'

Результат:

Результат


15
Ідеально! Я навіть можу обмежити вихід лише іменами ref, додавши їх --format=%(refname).
Джо Вайт

35
Це краще для мене:git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname) %(committerdate) %(authorname)' | sed 's/refs\/heads\///g'
saeedgnu

2
@ilius: чому б не використовувати :shortname?
Якуб Нарубський

37
@ilius: Як @BeauSmith писав: git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/. git-for-every-ref (1) manpage каже: Для неоднозначного короткого найменування додатку ref :short.
Якуб Нарубський

76
Це кольорова версія, що включає хеші, повідомлення, упорядковані за зростанням на основі дати фіксації, з відносним віком останнього комітету на кожній гілці. Я вкрав усі ідеї у вас, хлопці, вище. Це в моєму .gitconfig у [alias]розділі, і я це люблю. br = for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'
Майкл Персі

124

Список назв гілок Git, упорядкований останніми комісіями…

Розгортаючись на відповідь Якуба та підказку Джо , далі буде викреслено "refs / heads /", тож у висновку відображаються лише назви гілок:


Команда:

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

Результат:

Останні гілки Git


4
Ви також можете використовувати --format=%(refname:short)замість того, щоб покладатися на cut.
Чайтанья Гупта

3
Чи можна зробити це для сховища REMOTE?
Аллан Боу

10
aah - @ jakub.g вже пояснив: ви можете отримати віддалені гілки, які передають refs / remote / замість refs / heads /. Ідеально !!
Аллан Боу

Мені це подобається, якщо ви намагаєтесь його псевдонімом, що я зробив, git rbпам'ятати, щоб оточити команду цитатами:git config --global alias.rb "for-each-ref --count=20 --sort=-committerdate refs/heads/ --format=\'%(refname:short)\'"
Майкл Дісценза

2
Тепер ви можете це зробити git branch, тому отримання локальних, віддалених або всіх гілок працює як на git-гілках (тобто -r, -a). git branch -r --sort=committerdate --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'
фрад

89

Ось оптимальний код, який поєднує в собі дві інші відповіді:

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

10
Навіть трохи мор оптимізовано для отримання табличного результату:git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'
Шетбі

2
мені чомусь довелося використовувати подвійні лапки на windows, але в іншому випадку вони працюють просто чудово :)
amenthes

1
@schoetbi Цей код схожий на код з nikolay, що ви змінили, щоб зробити його табличним?
Енріко

@Enrico та інші, які можуть задатися питанням про одне і те ж. nikolay змінив свою відповідь, використовуючи пропозицію scietbis. Переміщуючи спочатку дату, яка завжди однакової довжини, результат здається більш табличним.
Джонні

83

Ось проста команда, яка перераховує всі гілки з останніми комісіями:

git branch -v

Щоб замовити найновішу комісію, використовуйте

git branch -v --sort=committerdate

Джерело: http://git-scm.com/book/en/Git-Branching-Branch-Management


11
git branch -avякщо ви хочете бачити і немісцеві гілки.
Скотт Стаффорд

34
Це не впорядковується за датою здійснення відповідно до питання.
Кас

1
Неважко git branch -vвключити дату кожного переліченого комітету?
dumbledad

1
як щодо <pre> git гілка -v --sort = committerdate </pre>?
iraj jelodari

2
Це круто. Мені подобається git branch -va --sort=-committerdateпоказувати немісцеві гілки, з останніми зміненими гілками вгорі.
Клінтон Блекмор

61

Я використовую наступний псевдонім:

recent = "!r(){git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)'|column -ts'|'}; r"

яка виробляє:

Результат

Використовувати "|" розділяти.


1
Чудовий псевдонім! Я хотів би запропонувати column -ts'|'і ввести символи, якщо кома може виникати у відносних часових позначках у вашій мові.
Бьорн Ліндквіст

1
чудовий псевдонім, дуже дякую чи можете ви покращити його, щоб показати поточну гілку з іншим кольором або з * на початку?
elhadi dp ıpɐɥ ן ǝ

2
Принаймні, в останній версії git ви можете просто додати '%(HEAD) ...'на початку рядка формату, щоб отримати той самий ефект, не прокладаючи sedкоманду
Джошуа Skrzypek

5
Я не міг це зробити, щоб він працював як псевдонім git. Мені довелося скористатися[alias] recent = !git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)'|column -ts'|'
Уеслі Сміт

11
Довелося додати --color = завжди, щоб отримати колір. git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)' --color=always|column -ts'|'}
користувач3342930

40

Мені вдалося посилатися на попередні приклади, щоб створити щось найкраще для мене.

git for-every-ref --sort = -committerdate refs / heads / --format = '% (авторизація: коротка)% (колір: червоний)% (ім'я об'єкта: короткий)% (колір: жовтий)% (перейменування: короткий )% (колір: скидання) (% (колір: зелений)% (дата передачі: відносна)% (колір: скидання)) '

Знімок екрана


1
Це виглядає приємно, барвистіше, ніж використання безпосередньо гіт-гіта, як я запропонував у stackoverflow.com/a/33163401/6309 . +1
VonC

2
Цей для мене вийшов з коробки, на відміну від деяких інших, тому я проголосував за це.
Кейсі

1
Працювали як насправді чудово! Дякую! :-)
FrozenTarzan

1
Дітто - цей працював нестандартно, на відміну від ряду інших, які я просто спробував. Дякую.
Dan Nissenbaum

2
Цей чистий і акуратний. Колись я додав би віддалене ім’я та ім’я автора так: git for-each-ref --sort=-committerdate refs/heads/ refs/remotes --format='%(authordate:short) %(authorname) %(color:red)%(objectname:short) %(color:yellow)%(refname:short)%(color:reset) (%(color:green)%(committerdate:relative)%(color:reset))'
ywu

38

Також мені потрібні кольори, теги та віддалені посилання без жодних дублікатів:

for ref in $(git for-each-ref --sort=-committerdate --format="%(refname)" refs/heads/ refs/remotes ); do git log -n1 $ref --pretty=format:"%Cgreen%cr%Creset %C(yellow)%d%Creset %C(bold blue)<%an>%Creset%n" | cat ; done | awk '! a[$0]++'

Оскільки цитування може бути важким, ось псевдонім для Bash:

alias glist='for ref in $(git for-each-ref --sort=-committerdate --format="%(refname)" refs/heads/ refs/remotes ); do git log -n1 $ref --pretty=format:"%Cgreen%cr%Creset %C(yellow)%d%Creset %C(bold blue)<%an>%Creset%n" | cat ; done | awk '"'! a["'$0'"]++'"

$ <ваша команда тут> awk: синтаксична помилка біля рядка 1 awk: виведення біля рядка 1
Джеймі Мейсон

@GotNoSugarBaby Ви використовуєте одинарні лапки, як, наприклад, приклад? яку оболонку ви використовуєте? Інакше Баш надає цьому персонажу особливого значення.
Естані

ей, я запустив це на / bin / bash (GNU bash, версія 4.0.28 (1) -release (i386-pc-solaris2.11)) з прямою копією та вставкою вашого прикладу - але з тих пір я бігав він у / bin / bash (GNU bash, версія 3.2.48 (1) -випуск (x86_64-apple-darwin12)), і він працює, тому я зніму голосування. Дякую багато естані.
Джеймі Мейсон

@GotNoSugarBaby Я використовую 4.2.25 (1) -випуск (x86_64-pc-linux-gnu) над спробував на 3.x і працював. Я не впевнений, про що це було ... але це може бути бенном, пов'язаним з версією git, замість башти. У будь-якому випадку, я радий, що це працює для вас!
Естані

1
@MichaelDiscenza просто перекладає все на голову. це було б додати | head -n20наприкінці. Якщо ви використовуєте псевдонім, переконайтеся , що це йде в лапках.
Естані

24

Інші відповіді, здається, не дозволяють пройти, -vvщоб отримати багатослівний вихід.

Отже, ось один вкладиш, який сортує git branch -vvза датою фіксації, зберігаючи колір тощо:

git branch -vv --color=always | while read; do echo -e $(git log -1 --format=%ct $(echo "_$REPLY" | awk '{print $2}' | perl -pe 's/\e\[?.*?[\@-~]//g') 2> /dev/null || git log -1 --format=%ct)"\t$REPLY"; done | sort -r | cut -f 2

Якщо ви хочете додатково надрукувати дату здійснення, ви можете скористатися цією версією:

git branch -vv --color=always | while read; do echo -e $(git log -1 --format=%ci $(echo "_$REPLY" | awk '{print $2}' | perl -pe 's/\e\[?.*?[\@-~]//g') 2> /dev/null || git log -1 --format=%ci)" $REPLY"; done | sort -r | cut -d ' ' -f -1,4-

Вибірка зразка:

2013-09-15   master                  da39a3e [origin/master: behind 7] Some patch
2013-09-11 * (detached from 3eba4b8) 3eba4b8 Some other patch
2013-09-09   my-feature              e5e6b4b [master: ahead 2, behind 25] WIP

Це, мабуть, більш читабельний розділений на кілька рядків:

git branch -vv --color=always | while read; do
    # The underscore is because the active branch is preceded by a '*', and
    # for awk I need the columns to line up. The perl call is to strip out
    # ansi colors; if you don't pass --color=always above you can skip this
    local branch=$(echo "_$REPLY" | awk '{print $2}' | perl -pe 's/\e\[?.*?[\@-~]//g')
    # git log fails when you pass a detached head as a branch name.
    # Hide the error and get the date of the current head.
    local branch_modified=$(git log -1 --format=%ci "$branch" 2> /dev/null || git log -1 --format=%ci)
    echo -e "$branch_modified $REPLY"
# cut strips the time and timezone columns, leaving only the date
done | sort -r | cut -d ' ' -f -1,4-

Це також повинно працювати з іншими аргументами git branch, наприклад, -vvrдля переліку гілок віддаленого відстеження або -vvaдля списку як віддаленого відстеження, так і локальних гілок.


-vvможе бути корисним, дякую. Однак це рішення все ще породжує нові процеси для кожної галузі, яких ОП хотіла уникнути.
musiphil

Насправді git branchконкретно не визначається значення -vv, а лише -v, тому -vvмає бути те саме, що -v.
musiphil

2
Це найкраще. І додавання -avv також враховує віддалені гілки. Дякую за це!
Гоферхан

@musiphil Моя сторінка моєї гілки , розділ -v, -vv, --verboseмістить таке:If given twice, print the name of the upstream branch, as well
Перлеоне,

@Perleone: Я не знаю, як я отримав цю інформацію, але ви праві, і я виправлений. Дякую!
musiphil

23

git 2.7 (Q4 2015) запровадить сортування гілок, використовуючи безпосередньо git branch:
Див. виконувати aa3bc55 , здійснювати aedcb7d , здійснювати 1511b22 , здійснювати f65f139 , ... (23 вересня 2015 р.), виконувати aedcb7d , виконувати 1511b22 , виконувати ca41799 (24 вересня 2015 р.) та фіксувати f65f139 , ... (23 вересня 2015 р.) від Картика Наяка ( KarthikNayak) .
(Об’єднав Хуніо С Хамано - gitster- у комітеті 7f11b48 , 15 жовтня 2015 р.)

Зокрема, зробити aedcb7d :

branch.c: використовувати ref-filterAPI ' '

Створіть API ' branch.c' використовувати ' ref-filter' для ітерації за допомогою сортування реф. Це видаляє більшу частину коду, який використовується при branch.cзаміні його викликами до ref-filterбібліотеки.

Він додає опцію--sort=<key> :

Сортувати на основі даного ключа.
Префікс -для сортування у порядку зменшення значення.

Ви можете використовувати цю --sort=<key>опцію кілька разів, і тоді останній ключ стає первинним ключем.

Підтримувані клавіші такі ж, як і вgit for-each-ref .
Сортувати за замовчуванням порядок сортування на основі повного імені (включаючи refs/...префікс). У цьому списку перераховано спочатку відокремлену HEAD (якщо вона присутня), потім локальні відділення та нарешті гілки дистанційного відстеження.

Тут:

git branch --sort=-committerdate 

Або (див. Нижче з Git 2.19)

# if you are sure to /always/ want to see branches ordered by commits:
git config --global branch.sort -committerdate
git branch

Дивіться також зобов’язання 9e46833 (30 жовтня 2015 р.) Від Картика Наяка ( KarthikNayak) .
Допомагає: Хуніо С Хамано ( gitster) .
(Об’єднано Хуніо С Хамано - gitster- у комітеті 415095f , 03 листопада 2015 р.)

При сортуванні за числовими значеннями (наприклад --sort=objectsize) немає порівняльного резервного порівняння, коли обидва запису мають одне значення. Це може призвести до несподіваних результатів (тобто порядок лістингу рефінансування з рівними значеннями не може бути визначений заздалегідь), як вказував Йоханнес Сікст ( $ gmane / 280117 ).

Отже, повернення до алфавітного порівняння на основі імені, коли інший критерій є рівним .

$ git branch --sort=objectsize

*  (HEAD detached from fromtag)
      branch-two
      branch-one
      master

З Git 2.19 порядок сортування можна встановити за замовчуванням.
git branchпідтримує конфігурацію branch.sort, наприклад git tag, у якій вже було налаштовано tag.sort.
Див. Комісію 560ae1c (16 серпня 2018 р.) Семюеля Мафтуля (``) .
(Об’єднав Хуніо С Хамано - gitster- в комітеті d89db6f , 27 серпня 2018 р.)

branch.sort:

Ця змінна контролює впорядкування сортування гілок, коли їх відображає git-branch.
Без --sort=<value>наданої опції " " значення цієї змінної використовуватиметься за замовчуванням.


Щоб перерахувати віддалені гілки, використовуйте git branch -r --sort=objectsize. -rПрапор змушує його в список віддалених філій замість місцевих відділень.


З варіантами Git 2.27 (Q2 2020), " git branch" та інші " for-each-ref" прийняли кілька --sort=<key>варіантів у порядку зростання пріоритетності, але у нього було декілька обривів навколо " --ignore-case" обробки та переривання зв'язків із іменем, які були виправлені.

Див. Команду 7c5045f , виконайте 76f9e56 (03 травня 2020 р.) Джеффа Кінга ( peff) .
(Об'єднав Хуніо С Хамано - gitster- у комітеті 6de1630 , 08 травня 2020 р.)

ref-filter: застосувати сортування резервного перейменування лише після всіх типів користувачів

Підписався: Джефф Кінг

Фіксувати 9e468334b4 ( « ref-filter: Відкат за алфавітом порівняння», 2015-10-30, Git v2.7.0-RC0 - злиття перерахованого в партії # 10 ) Сортувати Викладав реф-фільтр для відкоту до порівнює refnames.
Але це було зроблено на неправильному рівні, замінивши результат порівняння для одного " --sort" ключа від користувача, а не після того, як усі ключі сортування вичерпані.

Це працювало правильно для одного " --sort" варіанта, але не для декількох.
Ми розірвемо будь-які зв’язки в першому ключі з іменем і взагалі ніколи не будемо оцінювати другий ключ.

Щоб зробити речі ще цікавішими, ми застосовуємо цю резервну віддачу лише іноді!
Для поля типу " taggeremail", яке вимагає порівняння рядків, ми справді повернемо результат strcmp(), навіть якщо він був 0.
Але для числових " value" полів на зразок " taggerdate" ми застосували резервний запас. І тому наш тест на кілька сортування пропустив це: він використовується taggeremailяк основне порівняння.

Тож почнемо з додавання набагато більш жорсткого тесту. У нас буде набір комісій, що виражають кожну комбінацію двох тегерів електронної пошти, дат та імен. Тоді ми можемо підтвердити, що наш сортування застосовується з правильним пріоритетом, і ми будемо вражати як порівняння рядків, так і значень.

Це показує помилку, і виправлення просте: переміщення резервної системи до зовнішньої compare_refs()функції, після того, як всі ref_sortingклавіші вичерпані.

Зауважте, що у зовнішній функції у нас немає "ignore_case"прапора, оскільки він є частиною кожного окремого ref_sortingелемента. Дискусійним є те, що повинен робити такий резервний запас, оскільки ми не використовували ключі користувача для відповідності.
Але до цього часу ми намагалися поважати цей прапор, тому найменш інвазивна річ - намагатися продовжувати це робити.
Оскільки всі абоненти в поточному коді або встановлюють прапор для всіх клавіш, або для жодного, ми можемо просто витягнути прапор із першого ключа. У гіпотетичному світі, коли користувач дійсно може перевернути нечутливість клавіш окремо, ми можемо захотіти розширити код, щоб відрізнити цей випадок від ковдри " --ignore-case".


Щоб переглянути список віддалених з цією опцією, додайте-r
Troy Daniels

@TroyDaniels Погодився. Ви можете відредагувати відповідь. Я перегляну вашу редакцію.
VonC

19

Мені подобається використовувати відносну дату та скорочувати назву гілки так:

git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads

Що дає результат:

21 minutes ago  nathan/a_recent_branch
6 hours ago     master
27 hours ago    nathan/some_other_branch
29 hours ago    branch_c
6 days ago      branch_d

Я рекомендую створити файл Bash для додавання всіх улюблених псевдонімів, а потім поділитися сценарієм зі своєю командою. Ось приклад для додавання саме цього:

#!/bin/sh

git config --global alias.branches "!echo ' ------------------------------------------------------------' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------'"

Тоді ви можете просто зробити це, щоб отримати добре відформатований і відсортований список місцевих відділень:

git branches

Оновлення: зробіть це, якщо хочете забарвлення:

#!/bin/sh
#
(echo ' ------------------------------------------------------------‌​' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------‌​') | grep --color -E "$(git rev-parse --abbrev-ref HEAD)$|$"

Це дає меніfatal: unknown field name: '-authordate:iso8601'
Factor Mystic

1
Вишуканий кольоровий вихід - це фантазія, але це просто і саме те, що я шукав. Замінити refs/headsз , refs/remotesщоб поглянути на віддалених філіях.
Ламбарт

Сама команда прекрасна, але псевдонім видає помилку:expansion of alias 'branches' failed; 'echo' is not a git command
Філіп Кан

Працює для мене. Що станеться, якщо ви просто скопіюєте це вставити в термінал? (echo ' ------------------------------------------------------------‌​' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------‌​') | grep --color -E "$(git rev-parse --abbrev-ref HEAD)$|$"
n8tr

17

Станом на Git 2.19 ви можете просто:

git branch --sort=-committerdate

Ви також можете:

git config branch.sort -committerdate

Отже, коли ви перераховуєте гілки в поточному сховищі, вони будуть перераховані за сортуванням за комітетом.

Якщо ви завжди перераховуєте гілки, ви хочете, щоб вони були відсортовані за comitterdate:

git config --global branch.sort -committerdate

Відмова: Я є автором цієї функції в Git, і я реалізував її, коли побачив це питання.


2
Найсучасніша відповідь, набагато простіше, ніж використання складних сценаріїв або псевдонімів
mtefi

Використовуйте обережно! Остерігайтеся всіх, це не команда перелічувати гілки. Це команда змінити конфігурацію Git і матиме постійні глобальні наслідки.
Язимов

1
@Jazimov ви праві, я відредагував відповідь, щоб було зрозуміліше
user801247

11

Додає колір (оскільки pretty-formatнедоступний)

[alias]
    branchdate = for-each-ref --sort=-committerdate refs/heads/ --format="%(authordate:short)%09%(objectname:short)%09%1B[0;33m%(refname:short)%1B[m%09"

9

У мене була така ж проблема, тому я написав дорогоцінний камінь Ruby під назвою Twig . Він перераховує гілки в хронологічному порядку (найновіший перший), а також може дозволити вам встановити максимальний вік, щоб ви не перелічували всі гілки (якщо їх у вас багато). Наприклад:

$ twig

                              issue  status       todo            branch
                              -----  ------       ----            ------
2013-01-26 18:00:21 (7m ago)  486    In progress  Rebase          optimize-all-the-things
2013-01-26 16:49:21 (2h ago)  268    In progress  -               whitespace-all-the-things
2013-01-23 18:35:21 (3d ago)  159    Shipped      Test in prod  * refactor-all-the-things
2013-01-22 17:12:09 (4d ago)  -      -            -               development
2013-01-20 19:45:42 (6d ago)  -      -            -               master

Він також дозволяє зберігати власні властивості для кожної гілки, наприклад, ідентифікатор квитка, статус, todos та фільтрувати список гілок відповідно до цих властивостей. Більше інформації: http://rondevera.github.io/twig/


5
Це ім'я може не допомогти, оскільки я впевнений, що там є кілька програм із тим же ім’ям.
торок

8

Я придумав таку команду (для Git 2.13 та пізніших версій):

git branch -r --sort=creatordate \
    --format "%(creatordate:relative);%(committername);%(refname:lstrip=-1)" \
    | grep -v ";HEAD$" \
    | column -s ";" -t

Якщо у вас немає, columnможна замінити останній рядок на

    | sed -e "s/;/\t/g"

Вихід виглядає так

6 years ago             Tom Preston-Werner  book
4 years, 4 months ago   Parker Moore        0.12.1-release
4 years ago             Matt Rogers         1.0-branch
3 years, 11 months ago  Matt Rogers         1.2_branch
3 years, 1 month ago    Parker Moore        v1-stable
12 months ago           Ben Balter          pages-as-documents
10 months ago           Jordon Bedwell      make-jekyll-parallel
6 months ago            Pat Hawks           to_integer
5 months ago            Parker Moore        3.4-stable-backport-5920
4 months ago            Parker Moore        yajl-ruby-2-4-patch
4 weeks ago             Parker Moore        3.4-stable
3 weeks ago             Parker Moore        rouge-1-and-2
19 hours ago            jekyllbot           master

Я написав допис у блозі про те, як працюють різні твори.


Приємно. +1. Він використовує git branch --sortзгадане мною в stackoverflow.com/a/33163401/6309 .
VonC

@DanNissenbaum Переконайтеся, що ви використовуєте Git 2.13 (випущений у травні 2017 року) або пізнішої версії.
бдешам

7

FYI, якщо ви хочете отримати список нещодавно перевірених гілок (на відміну від нещодавно скоєних), ви можете скористатися рефлогом Git:

$ git reflog | egrep -io "moving from ([^[:space:]]+)" | awk '{ print $3 }' | head -n5
master
stable
master
some-cool-feature
feature/improve-everything

Дивіться також: Як я можу отримати список гілок Git, який я нещодавно перевірив?


5

Ось невеликий сценарій, який я використовую для перемикання між останніми гілками:

#!/bin/bash
# sudo bash

re='^[0-9]+$'

if [[ "$1" =~ $re ]]; then
    lines="$1"
else
    lines=10
fi
branches="$(git recent | tail -n $lines | nl)"
branches_nf="$(git recent-nf | tail -n $lines | nl)"
echo "$branches"

# Prompt which server to connect to
max="$(echo "$branches" | wc -l)"
index=
while [[ ! ( "$index" =~ ^[0-9]+$ && "$index" -gt 0 && "$index" -le "$max" ) ]]; do
    echo -n "Checkout to: "
    read index
done

branch="$( echo "$branches_nf" | sed -n "${index}p" | awk '{ print $NF }' )"
git co $branch
clear

Використання цих двох псевдонімів:

recent = for-each-ref --sort=committerdate refs/heads/ --format=' %(color:blue) %(authorname) %(color:yellow)%(refname:short)%(color:reset)'
recent-nf = for-each-ref --sort=committerdate refs/heads/ --format=' %(authorname) %(refname:short)'

Просто зателефонуйте до цього у сховище Git, і він покаже вам останні N гілок (10 за замовчуванням) та число в кожній стороні. Введіть номер відділення, і він перевірить:

Введіть тут опис зображення


4

Зазвичай ми вважаємо віддалені гілки останнім часом. Тож спробуйте це

git fetch
git for-each-ref --sort=-committerdate refs/remotes/origin

4

Ось ще один сценарій, який робить те, що роблять всі інші сценарії. Насправді він забезпечує функцію для вашої оболонки.

Його внесок полягає в тому, що він витягує деякі кольори з конфігурації Git (або використовує параметри за замовчуванням).

# Git Branch by Date
# Usage: gbd [ -r ]
gbd() {
    local reset_color=`tput sgr0`
    local subject_color=`tput setaf 4 ; tput bold`
    local author_color=`tput setaf 6`

    local target=refs/heads
    local branch_color=`git config --get-color color.branch.local white`

    if [ "$1" = -r ]
    then
        target=refs/remotes/origin
        branch_color=`git config --get-color color.branch.remote red`
    fi

    git for-each-ref --sort=committerdate $target --format="${branch_color}%(refname:short)${reset_color} ${subject_color}%(subject)${reset_color} ${author_color}- %(authorname) (%(committerdate:relative))${reset_color}"
}

3

Це засновано на версії saeedgnu , але з поточною гілкою, показаною зіркою та кольором, і показує лише те, що не було описано як "місяці" чи "роки" тому:

current_branch="$(git symbolic-ref --short -q HEAD)"
git for-each-ref --sort=committerdate refs/heads \
  --format='%(refname:short)|%(committerdate:relative)' \
  | grep -v '\(year\|month\)s\? ago' \
  | while IFS='|' read branch date
    do
      start='  '
      end=''
      if [[ $branch = $current_branch ]]; then
        start='* \e[32m'
        end='\e[0m'
      fi
      printf "$start%-30s %s$end\\n" "$branch" "$date"
    done

2

Мій найкращий результат як сценарій:

git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname:short)|%(committerdate:iso)|%(authorname)' |
    sed 's/refs\/heads\///g' |
    grep -v BACKUP  | 
    while IFS='|' read branch date author
    do 
        printf '%-15s %-30s %s\n' "$branch" "$date" "$author"
    done

1
Який сценарій? Баш?
Пітер Мортенсен

2

git branch --sort=-committerdate | head -5

Для будь-кого, хто зацікавлений отримати лише п’ять найменувань філій, відсортованих за датою вступу.



1

Ось варіант, який я шукав:

git for-each-ref --sort=-committerdate --format='%(committerdate)%09%(refname:short)' refs/heads/ | tail -r

Це tail -rперевертає список, щоб останнім commiterdateбуло останнє.


3
Ви також можете змінити --sort = -committerdate на --sort = committerdate, щоб досягти цього.
рефорама


1

Я передаю вихід із прийнятої відповіді в dialogінтерактивний список:

#!/bin/bash

TMP_FILE=/tmp/selected-git-branch

eval `resize`
dialog --title "Recent Git Branches" --menu "Choose a branch" $LINES $COLUMNS $(( $LINES - 8 )) $(git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname:short) %(committerdate:short)') 2> $TMP_FILE

if [ $? -eq 0 ]
then
    git checkout $(< $TMP_FILE)
fi

rm -f $TMP_FILE

clear

Збережіть як (наприклад) ~/bin/git_recent_branches.shі chmod +xце. Тоді, git config --global alias.rb '!git_recent_branches.sh'щоб дати мені нову git rbкоманду.


1

Я знаю, що вже є багато відповідей, але ось два мої центи за простий псевдонім (мені подобається, щоб моя остання гілка була внизу):

[alias]
        br = !git branch --sort=committerdate --color=always | tail -n15
[color "branch"]
        current = yellow
        local = cyan
        remote = red

Це дасть вам хороший огляд ваших останніх 15 галузей у кольорі з виділеною вашою поточною гілкою (і на ній є зірочка).


1

Були проблеми з обробкою одинарних лапок на Mac у bash_profile при спробі встановити псевдонім. Ця відповідь допомогла вирішити " Як уникнути одинарних лапок у межах одного цитованого рядка

Робоче рішення:

alias gb='git for-each-ref --sort=committerdate refs/heads/ --format='"'"'%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'"'"''

PS Не міг коментувати через мою репутацію


0

git for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))' це те, що вам потрібно


0

Git v2.19 вводить branch.sortпараметр config (див. Гілку.sort ).

Так git branchбуде сортувати за датою читання (desc) за замовчуванням з

# gitconfig
[branch]
    sort = -committerdate     # desc

сценарій:

$ git config --global branch.sort -committerdate

Оновлення:

Тому,

$ git branch
* dev
  master
  _

і

$ git branch -v
* dev    0afecf5 Merge branch 'oc' into dev
  master 652428a Merge branch 'dev'
  _      7159cf9 Merge branch 'bashrc' into dev
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.