Как мога да получа списък с подразделенията на Git, поръчани по последния ангажимент?

Искам да получа списък на всички клонове в хранилището на Git с „най-пресните“ клони в горната част, където „най-свежият“ клон е този, който е фиксиран съвсем наскоро (и затова най-вероятно ще е един от искам да привлека вниманието) ,

Има ли начин да използвам Git за: (а) сортиране на списъка на клоновете с последното фиксиране или (б) получаване на списъка на клоновете заедно с всяка последна фиксирана дата в някакъв формат за машинно четене?

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

977
04 марта '11 в 3:26 2011-03-04 03:26 Джо Уайт попита на 04 март 2009 г. в 3:26 2011-03-04 03:26
@ 26 отговора

Използвайте --sort=-committerdate в git for-each-ref ;

Предлага се и от Git 2.7.0 за git branch :

Основна употреба:

 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))' 

резултат:

border=0

1379
04 марта '11 в 3:33 2011-03-04 03:33 отговорът е даден от Jakub Narębski на 04.03.2011 г. в 3:33 2011-03-04 03:33

Списък на имената на клоновете на git, подредени по последния запис ...

Обръщайки се към отговора на Jakubs и подсказването на Joes, следното ще зачеркне "refs / heads /", така че имената на клоновете ще бъдат показани на изхода:


екип:

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

резултат:

2019

Това е оптималният код, който съчетава два други отговора:

 git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)' 
78
22 мая '12 в 2:22 2012-05-22 02:22 отговорът е даден николай 22 май '12 в 2:22 ч. 2012-05-22 02:22

Ето една проста команда, която изброява всички клонове с най-новите съобщения:

 git branch -v 

За да поръчате последния фиксатор, използвайте

 git branch -v --sort=committerdate 

Източник: http://git-scm.com/book/en/Git-Branching-Branch-Management

68
13 марта '13 в 14:54 2013-03-13 14:54 отговорът е даден от user1682406 13 март '13 в 14:54 2013-03-13 14:54

Използвам следния псевдоним:

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"

който произвежда: 2019

38
06 мая '15 в 15:05 2015-05-06 15:05 отговорът е даден dimid 06 май '15 в 15:05 2015-05-06 15:05

Също така се нуждаех от цветове, маркери и изтрити връзки без дубликати:

 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'"]++'" 
36
19 авг. отговорът е даден от estani 19 aug. 2013-08-19 12:27 '13 в 12:27 2013-08-19 12:27

Успях да се позова на горните примери, за да създам нещо, което е най-добро за мен.

git for-every-ref --sort = -commiterdate refs / heads / --format = '% (authordate: short)% (цвят: червен)% (име на обект: short)% (цвят: жълт)% (име: кратък)% (цвят: рестартиране) (% (Цвят: зелен)% (дата на заверяване: относителна)% (цвят: нулиране))

2019

13 июня '17 в 22:09 2017-06-13 22:09 отговорът е даден от Анди на 13 юни 2006 г. в 10:09 часа 2017-06-06 22:09

Други отговори изглежда не позволяват -vv за детайлно извеждане.

Ето един шрифт, който сортира git branch -vv чрез фиксиране на датата, запазване на цвета и т.н .:

 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 

Вероятно това е по-разбираемо разделение на няколко реда:

23
12 сент. Отговор, даден от John Mellor Sep 12 2013-09-12 18:06 '13 в 18:06 2013-09-12 18:06

git 2.7 (Q4 2015) ще влезе в сортирането на клонове, като използва клона за директен git branch :
Вж. Commit aa3bc55 , ангажирайте aedcb7d , фиксирайте 1511b22 , фиксирайте f65f139 , ... (23 септември 2015), ангажирайте aedcb7d , фиксирайте 1511b22 , започнете ca41799 (24 септември 2015) и започнете f65f139 , ... (23 септември 2015) от Karthik Nayak ( KarthikNayak ) .
(Сливането с Yunio S gitster - gitster - ангажирано 7f11b48 , 15 октомври 2015 г.)

По-специално, поправете aedcb7d :

branch.c : използвайте API за ref-filter

Създайте „ branch.c “, използвайки API „ ref-filter “, за да превъртате с използване на сортиране. Това премахва по-голямата част от кода, използван в " branch.c ", като го заменя с повиквания към библиотеката " ref-filter ".

Добавя опцията --sort=<key> :

Сортиране въз основа на даден ключ.
Префикс - сортиране в низходящ ред на стойността.

Можете да използвате --sort=<key> няколко пъти, като в този случай първият ключ става последният ключ.

Поддържаните ключове са същите като в git for-each-ref .
По подразбиране редът на сортиране е сортиран въз основа на пълното име (включително префикс на refs/... ). То изброява отделните глави (ако има такива), тогава местните клонове и, накрая, отдалечените клонове за проследяване.

Ето:

 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 ( KarthikNayak ) .
Асистент: Junio ​​S gitster ( gitster ) .
(Сливането с Unio S gitster - gitster - ангажирано 415095f , 03 ноември 2015 г.)

Когато сортирате по числови стойности (например, --sort=objectsize ), няма сравнително сравнение, когато и двата refs съхраняват една и съща стойност. Това може да доведе до неочаквани резултати (т.е. редът на изброяване на връзки с равни стойности не може да бъде предварително определен), както е посочено от Johannes Sixt ( $ 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 г.) от Samuel Maftoul ('') .
(Сливането с Junio ​​S gitster - gitster - при изпълнението на d89db6f , 27 август 2018 г.)

 branch.sort: 

Тази променлива контролира подреждането на сортирането на клонове при показване на git-branch .
Без --sort=<value> " --sort=<value> " стойността на тази променлива ще се използва по подразбиране.


За да укажете отдалечени клонове, използвайте git branch -r --sort=objectsize . Флаг -r причинява неговите -r отдалечени клонове вместо локални клонове.

21
16 окт. отговорът е даден VonC 16 oct. 2015-10-16 08:53 '15 в 8:53 2015-10-16 08:53

Обичам да използвам относителната дата и съкращавам името на клона, както следва:

 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)$|$" 
19
30 мая '14 в 1:30 2014-05-30 01:30 отговорът е даден n8tr 30 май 14 в 1:30 2014-05-30 01:30

Добавя цвят (защото 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" 
11
27 янв. отговорът е даден epylinkn 27 януари 2014-01-27 22:23 '14 в 10:23 ч. 2014-01-27 22:23

С git 2.19 можете просто:

 git branch --sort=-committerdate 

Можете също така:

 git config branch.sort -committerdate 

Следователно, когато укажете клонове в текущото хранилище, то ще бъде сортирано по командата commiterdate.

Ако всеки път, когато укажете разклонения, искате те да се сортират по командата comitterdate:

 git config --global branch.sort -committerdate 

Опровержение: Аз съм автор на тази функция в git, внедрих го, когато видях този въпрос.

9
12 сент. Отговорът е даден от user801247 12 септември 2018-09-12 16:05 '18 в 16:05 ч. 2018-09-12 16:05

Имах същия проблем, така че написах перла от 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 

Той също така ви позволява да запазвате потребителски свойства за всеки клон, например идентификатор на билет, статус, задачи и филтрирате списъка на клоновете според тези свойства. Повече информация: http://rondevera.github.io/twig/

8
08 июня '13 в 8:40 2013-06-08 08:40 отговорът е даден от Рон Девера на 08 юни '13 в 8:40 2013-06-08 08:40

Измислих следната команда (за 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 

Написах блог пост за това как работят различните работи.

8
01 авг. отговорът е даден bdesham 01 август. 2017-08-01 03:26 '17 в 3:26 2017-08-01 03:26

FYI, ако искате да получите списък на наскоро написани клонове (за разлика от наскоро създадени такива), можете да използвате git reflog:

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

Вижте също: Как да получите списък на git клонове, които наскоро проверих?

7
02 авг. Отговорът е даден от Jordan Brough 02 Aug 2014-08-02 15:42 '14 в 15:42 2014-08-02 15:42

Ето друг скрипт, който изпълнява всички други скриптове. Всъщност, тя осигурява функция за вашата черупка.

Неговият принос е, че той извлича някои цветове от вашата конфигурация на 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}" } 
4
09 апр. отговор, даден от joeytwiddle 09 Apr. 2014-04-09 22:46 '14 в 22:46 ч. 2014-04-09 22:46

Ето малък скрипт, който използвам за превключване между последните клонове:

 #!/bin/bash # sudo bash re='^[0-9]+$' if [[ "$1" =~ $re ]]; then lines="$1" else lines=10 fi branchs="$(git recent | tail -n $lines | nl)" branchs_nf="$(git recent-nf | tail -n $lines | nl)" echo "$branchs" # Prompt which server to connect to max="$(echo "$branchs" | wc -l)" index= while [[ ! ( "$index" =~ ^[0-9]+$  "$index" -gt 0  "$index" -le "$max" ) ]]; do echo -n "Checkout to: " read index done branch="$( echo "$branchs_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 repo и ще ви покаже последните N клонове (10 по подразбиране) и номера в посока на всяка. Въведете номера на клона и той проверява:

2019

30 нояб. Отговорът е даден от Агус Ариас на 30 ноември 2016-11-30 01:09 '16 в 1:09 2016-11-30 01:09

Въз основа на версията на илиуса, но с текущия клон, показан от звезда и цвят, и показващ само нещо, което не е описано като "месеци" или "години" преди:

3
13 авг. отговор, даден от Mark Lodato 13 август. 2013-08-13 18:44 '13 в 18:44 2013-08-13 18:44

Най-добрият ми резултат като сценарий:

 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 
2
01 июля '13 в 16:10 2013-07-01 16:10 отговорът е даден от saeedgnu 1 юли '13 в 16:10 2013-07-01 16:10

Късно за парти тук. Приетият отговор е CML е отговорен, но ако имате нужда от нещо красиво, като GUI, и вашия произход === "github".

Можете да кликнете върху „Клонове“ в репо. или кликнете върху директния URL адрес: https://github.com/ORGANIZATION_NAME/REPO_NAME/branches

1
11 июня '14 в 17:36 2014-06-11 17:36 отговорът е даден от jahrichie 11 юни '14 в 17:36 ч. 2014-06-11 17:36

Въвеждам изхода от получения отговор в dialog за да ми даде интерактивен списък:

1
14 янв. Отговор, даден от Джон Делани на 14 януари 2016-01-14 17:59 '16 в 17:59 часа 2016-01-14 17:59

Ето варианта, който търсех:

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

Тази tail -r отменя списъка, така че последният commiterdate е последният.

1
14 мая '14 в 20:36 2014-05-14 20:36 отговорът е даден от Бен на 14 май 14 в 20:36 2014-05-14 20:36

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

За всеки, който се интересува от сортирането само на първите 5 имена на клонове въз основа на датата на изпълнителя.

1
18 янв. отговорът се дава от vardin на 18 януари 2019-01-18 14:02 '19 в 14:02 ч. 2019-01-18 14:02

Git v2.19 представлява конфигурацията branch.sort на branch.sort (вж. Branch.sort ).

По този начин, git branch ще сортира по подразбиране committer (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 
0
18 сент. отговорът се дава hIpPy 18 sep . 2018-09-18 07:53 '18 в 7:53 2018-09-18 07:53

Знам, че вече има много отговори, но ето и моите два цента за прост псевдоним (харесва ми, когато последният ми клон е долу):

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

Това ще ви даде добър преглед на последните ви 15 цветни клона, като текущият клон е маркиран (маркиран със звездичка).

0
07 февр. Отговор Tom 07 Feb 2019-02-07 03:42 '19 в 3:42 2019-02-07 03:42

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
10 апр. Отговорът е даден ChunkCoder 10 апр. 2018-04-10 22:32 '18 в 22:32 ч. 2018-04-10 22:32

Други въпроси относно таговете или Ask a Question