En son taahhüt tarafından sipariş edilen Git şubelerinin listesini nasıl alabilirim?


1323

Git deposundaki tüm dalların bir listesini en üstte "en taze" dallar ile almak istiyorum, burada "en taze" dal en son taahhüt edilen daldır (ve bu nedenle, daha büyük olasılıkla bir Dikkat etmek istiyorum).

Git'i ya (a) şube listesini son işleme göre sıralamak ya da (b) şube listesini her birinin son taahhüt tarihiyle birlikte bir tür makine tarafından okunabilir biçimde almak için kullanabilmemin bir yolu var mı?

En kötü durumda, her zaman git branchtüm dalların bir listesini almak, çıktısını ayrıştırmak ve daha sonra git log -n 1 branchname --format=format:%ciher biri için her dalın taahhüt tarihini almak için koşabilirdim . Ancak bu, yeni bir işlemin döndürülmesinin nispeten pahalı olduğu bir Windows kutusunda çalışacaktır, bu nedenle Git çalıştırılabilirini şube başına bir kez başlatmak çok fazla dal varsa yavaşlayabilir. Tüm bunları tek bir komutla yapmanın bir yolu var mı?



12
@Spundun, beni orada kaybettin. Perl ve sed aracılığıyla iletilenler de dahil olmak üzere çoklu komutların bir kombinasyonu Git'in zaten sahip olduğu bir komutu kullanmaktan "daha iyi" nasıl olur?
Joe White

36
@ git for-each-refJakub Narębski'nin cevabı ile ilgili olarak: refs/remotes/yerine uzak dallar alabilirsiniz refs/heads/(veya her ikisini de, boşlukla ayrılmış olarak geçirebilirsiniz); refs/tags/Etiketler için veya yalnızca refs/üç tür için.
jakub.g

4
Git 2.7'den (4. Çeyrek 2015) başlıyor, artık yok for-each-ref! Doğrudan kullanacaksınız git branch --sort=-committerdate: aşağıdaki cevabımı gör
VonC

Yanıtlar:


1874

Kullanım --sort=-committerdateseçeneği git for-each-ref;

Git 2.7.0'dan beri şunlar için de mevcuttur git branch:

Temel Kullanım:

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

Sonuç:

Sonuç

Gelişmiş Kullanım:

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

Sonuç:

Sonuç


15
Mükemmel! Ekleyerek çıktıyı sadece ref isimleriyle bile kısıtlayabilirim --format=%(refname).
Joe White

35
Bu benim için daha iyi:git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname) %(committerdate) %(authorname)' | sed 's/refs\/heads\///g'
saeedgnu

2
@ilius: neden kullanmıyorsunuz :shortname?
Jakub Narębski

37
@ilius: As @BeauSmith yazdı: git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/. git-for-each-ref (1) manpage diyor: Ref ekinin belirsiz olmayan kısa adı için :short.
Jakub Narębski

76
Bu, sağlama tarihine göre artan sipariş, her daldaki son işlemin göreceli yaşıyla birlikte karma, mesaj, renklendirilmiş bir sürümdür. Yukarıdaki tüm fikirleri sizden çaldım. Bölümdeki .gitconfig dosyamda [alias]ve çok seviyorum. 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))'
Michael Percy

124

En son işleme göre sıralanmış Git şube adlarının listesi…

Jakub'un cevabını ve Joe'nun ipucunu genişleterek , aşağıdakiler "refs / heads /" i çıkarır, böylece çıktı sadece dal adlarını görüntüler:


Komut:

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

Sonuç:

Son Git dalları


4
--format=%(refname:short)Güvenmek yerine de kullanabilirsiniz cut.
Chaitanya Gupta

3
UZAKTAN depo için bunu yapmanın bir yolu var mı?
Allan Bowe

10
aah - @ jakub.g zaten açıkladı: refs / heads / yerine refs / remotes / geçen uzak şubeleri alabilirsiniz. Mükemmel!!
Allan Bowe

git rbKomutu tırnak içine almayı hatırlamak için bunu yaptım, git config --global alias.rb "for-each-ref --count=20 --sort=-committerdate refs/heads/ --format=\'%(refname:short)\'"
taklit

2
Ve şimdi bunu ile yapabilirsiniz git branch, bu yüzden yerel, uzak veya tüm dalları almak git-branch (yani -r, -a) gibi çalışır. 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))'
17'de phord

89

İşte diğer iki yanıtı birleştiren en uygun kod:

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

10
Hatta biraz mor bir tablo çıktı almak için optimize edilmiş:git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'
schoetbi

2
nedense ben pencerelerde çift tırnak kullanmak zorunda kaldı, ama aksi takdirde bu gayet iyi :)
amenthes

1
@schoetbi Bu kod tam olarak nikolay koduna benziyor, tablo haline getirmek için neyi değiştirdiniz?
Enrico

@Enrico ve aynı şeyi merak edebilecek diğerleri. nikolay cevabını schoetbis önerisiyle değiştirdi. Her zaman aynı uzunlukta olan ilk taşıma tarihi ile sonuç daha tablo gibi görünür.
johnny

83

İşte en son taahhütleri olan tüm dalları listeleyen basit bir komut:

git branch -v

En son taahhütlere göre sipariş vermek için şunu kullanın:

git branch -v --sort=committerdate

Kaynak: http://git-scm.com/book/en/Git-Branching-Branch-Management


11
git branch -avyerel olmayan şubeleri de görmek istiyorsanız.
Scott Stafford

34
Bu, soruya göre taahhüt tarihine göre sıralanmaz.
Cas

1
git branch -vListelenen her bir taahhüdün tarihini dahil etmek kolay mı ?
Dumbledad

1
<pre> git branch -v --sort = committerdate </pre> ne dersin?
iraj jelodari

2
Bu harika. git branch -va --sort=-committerdateEn son değiştirilen dallar en üstte olan yerel olmayan şubeleri göstermeyi seviyorum .
Clinton Blackmore

61

Aşağıdaki takma adı kullanıyorum:

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"

hangi üretir:

Sonuç

'|' Kullanın ayırmak.


1
Harika takma ad! column -ts'|'Virgül karakteriniz, bulunduğunuz yerin göreli zaman damgalarında ortaya çıkabilirse, karakterleri öneririm .
Björn Lindqvist

1
harika takma ad, çok teşekkür ederim. mevcut dalı başka bir renkle veya başında * ile göstermek için geliştirebilir misiniz?
elhadi dp ıpɐɥ ן ǝ

2
En azından '%(HEAD) ...'sed
git'in

5
Git takma adı olarak çalışmak için bu gitemedi. [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'|'
Wesley Smith

11
Ben renk almak için --color = her zaman eklemek zorunda kaldı. 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'|'}
user3342930

40

Benim için en uygun olanı yaratmak için önceki örneklere başvurabildim.

git--each-ref --sort = -committerdate refs / heads / --format = '% (yazar: kısa)% (renk: kırmızı)% (nesne adı: kısa)% (renk: sarı)% (refname: kısa )% (renk: sıfırlama) (% (renk: yeşil)% (committerdate: göreceli)% (renk: sıfırla)) '

Çıktı Ekran Görüntüsü


1
Stackoverflow.com/a/33163401/6309'da önerdiğim gibi doğrudan git dalını kullanmaktan daha güzel, daha renkli görünüyor . +1
VonC

2
Bu benim için kutunun dışında çalıştı, diğerlerinden farklı olarak, ben oy verdim.
Casey

1
Gerçekten güzel olduğu gibi çalıştı! Teşekkürler! :-)
FrozenTarzan

1
Ditto - bu, yeni denediğim diğerlerinin aksine, kutudan çıktı. Teşekkürler.
Dan Nissenbaum

2
Bu temiz ve derli toplu. Bazen şu şekilde uzaktan ve yazar adı eklerdim: 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

Ayrıca herhangi bir kopya olmadan renkler, etiketler ve uzaktan referanslara ihtiyacım vardı:

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]++'

Alıntı yapmak zor olabileceğinden, Bash için takma ad:

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'"]++'"

$ <Buradaki komutunuz> awk: satır 1 yakınında sözdizimi hatası awk: satır 1 yakınında kurtarılıyor
Jamie Mason

@GotNoSugarBaby Örnek gibi tek tırnak mı kullanıyorsunuz? hangi kabuğu kullanıyorsun Bash bu karaktere aksi halde özel bir anlam verir.
estani

hey, bunu / bin / bash (GNU bash, sürüm 4.0.28 (1) -release (i386-pc-solaris2.11)) üzerinde örneğinizin düz bir kopyası ve macunu ile çalıştırdım - ancak o zamandan beri çalıştırıyorum / bin / bash (GNU bash, sürüm 3.2.48 (1) -release (x86_64-apple-darwin12)) ve çalışır, bu yüzden aşağı oyu kaldıracağım. Çok teşekkürler estani.
Jamie Mason

@GotNoSugarBaby 4.2.25 (1) -release (x86_64-pc-linux-gnu) nad kullanıyorum 3.x üzerinde denedim ve çalıştım. Ne sorun olduğundan emin değilim ... ama bash yerine git sürümüyle ilgili bir sorun bennn olabilir. Her durumda, senin için işe sevindim!
estani

1
@MichaelDiscenza herşeyi kafa karıştırıyor. | head -n20Sonunda eklemek olurdu . Takma ad kullanıyorsanız, bunun tırnak içinde olduğundan emin olun .
estani

24

Diğer cevaplar, geçmenin -vvayrıntılı çıktı elde etmesine izin vermiyor gibi görünüyor .

İşte burada git branch -vv, bitiş tarihine göre sıralanan, rengi koruyan vb.Tek bir astar :

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

Tamamlanma tarihini ayrıca yazdırmak istiyorsanız, bunun yerine bu sürümü kullanabilirsiniz:

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-

Örnek çıktı:

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

Muhtemelen birden fazla satıra bölünebilir:

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-

Bu git branch, örneğin -vvruzaktan izleme kollarını -vvalistelemek veya hem uzaktan izleme hem de yerel dalları listelemek gibi diğer argümanlarla da çalışmalıdır .


-vvgerçekten yararlı olabilir, teşekkürler. Bununla birlikte, bu çözüm hala OP'nin kaçınmak istediği her dal için yeni süreçler ortaya koymaktadır.
musiphil

Aslında git branchözellikle anlamını tanımlamaz -vvfakat sadece -v, bu -vvda aynı olmalıdır -v.
musiphil

2
En iyisi bu. Ve -avv eklemek uzak dalları da hesaba katar. Bunun için teşekkürler!
Gopherkhan

@musiphil Git şubem manpage, bölüm -v, -vv, --verboseaşağıdakileri içerir:If given twice, print the name of the upstream branch, as well
Perleone

@Perleone: Bu bilgiyi nasıl aldığımı bilmiyorum, ama haklısın ve düzeltilmeye devam ediyorum. Teşekkürler!
musiphil

23

git 2.7 (Q4 2015) şube doğrudan kullanarak sıralama tanıtacak git branch:
Bkz aa3bc55 işlemek , aedcb7d işlemek , 1511b22 taahhüt , f65f139 taahhüt , ... (2015 Eylül 23), aedcb7d işlemek , 1511b22 taahhüt , ca41799 işlemek , (24 Eylül 2015) ve taahhüt f65f139 , ... (23 Eyl 2015) yazan Karthik Nayak ( KarthikNayak) .
(Göre Birleştirilmiş - Junio Cı Hamano gitster- içinde 7f11b48 tamamlama 2015 15 Eki)

Özellikle, aedcb7d'yi taahhüt edin :

branch.c: ' ref-filter' API'lerini kullanın

Refs sıralama yoluyla yineleme için ' branch.c' kullanım ' ref-filter' API'leri yapın. Bu, ' branch.c' yerine kullanılan kodun çoğunu ' ref-filter' kütüphanesine yapılan çağrılarla kaldırır .

Bu seçenek ekler--sort=<key> :

Verilen anahtara göre sıralayın. Değerin azalan düzeninde sıralamak için
önek -.

--sort=<key>Seçeneği birden çok kez kullanabilirsiniz, bu durumda son anahtar birincil anahtar olur.

Desteklenen tuşlar, ile aynıdırgit for-each-ref .
Sıralama düzeni, tam refname ( refs/...önek dahil ) temelinde sıralamaya göre sıralanır . Bu önce önce HEAD (varsa), sonra yerel şubeleri ve son olarak uzaktan izleme şubelerini listeler.

Buraya:

git branch --sort=-committerdate 

Veya (Git 2.19 ile aşağıya bakın)

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

Ayrıca bkz . Karthik Nayak ( ) tarafından 9e46833 (30 Ekim 2015) taahhüdü . Yardım eden: Junio ​​C Hamano ( ) . (Tarafından Birleştirilmiş - Junio C Hamano - içinde 415095f taahhüt 2015 3 Kasım,)KarthikNayak
gitster
gitster

Sayısal değerlere (örneğin --sort=objectsize) göre sıralama yaparken, her iki ref aynı değerde olduğunda geri dönüş karşılaştırması yoktur. Bu, Johannes Sixt ( $ gmane / 280117 ) tarafından belirtildiği gibi beklenmedik sonuçlara neden olabilir (yani eşit değerlere sahip ref'lerin listelenme sırası önceden belirlenemez ).

Dolayısıyla, diğer ölçüt eşit olduğunda yeniden adlandırmaya dayalı alfabetik karşılaştırmaya geri dönüş .

$ git branch --sort=objectsize

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

Git 2.19 ile, sıralama düzeni varsayılan olarak ayarlanabilir.
git branchBir yapılandırma destekler branch.sortgibi git tagzaten yapılandırma vardı tag.sort. Samuel Maftoul'un (``) taahhüt ettiği 560ae1c (16 Ağu 2018)
bölümüne bakınız . (Tarafından Birleştirilmiş Junio C Hamano - - in d89db6f işlemek , 27 Ağustos 2018)
gitster

branch.sort:

Bu değişken, tarafından görüntülendiğinde dalların sıralama düzenini kontrol eder git-branch.
" --sort=<value>" Seçeneği belirtilmezse, bu değişkenin değeri varsayılan olarak kullanılır.


Uzak dalları listelemek için tuşunu kullanın git branch -r --sort=objectsize. -rBayrak yerine yerel şube uzak dalları listelemek neden olur.


Git 2.27 (Q2 2020) ile, " git branch" ve diğer " for-each-ref" varyantları --sort=<key>artan öncelik sırasına göre birden fazla seçeneği kabul ettiler , ancak " --ignore-case" işleme ve düzeltilen refname ile bağlantı kopma etrafında birkaç kırılma yaşandı.

Bkz. Taahhüt 7c5045f , taahhüt 76f9e56 (03 Mayıs 2020), Jeff King ( peff) .
(Göre Birleştirilmiş - Junio Cı Hamano gitster- içinde 6de1630 tamamlama 2020 08 Mayıs)

ref-filter: yedek refname sıralamasını yalnızca tüm kullanıcı sıralamasından sonra uygulayın

İmzalayan: Jeff King

Taahhüt 9e468334b4 (" ref-filter: alfabetik karşılaştırma için geri dönüş", 2015-10-30, Git v2.7.0-rc0 - toplu iş # 10'da listelenen birleştirme ), ref filtresinin, yeniden adlandırma karşılaştırmasına geri dönmeyi öğretti. Ancak bunu yanlış düzeyde yaptı ve tüm sıralama anahtarları tükendikten sonra kullanıcıdan tek bir " " anahtarı için karşılaştırma sonucunu geçersiz kıldı .
--sort

Bu, tek bir " --sort" seçeneği için doğru bir şekilde çalıştı , ancak birden fazla seçenek için işe yaramadı .
İlk anahtardaki herhangi bir bağı refname ile koparırız ve ikinci anahtarı asla değerlendirmeyiz.

Konuları daha da ilginç hale getirmek için, bu yedeklemeyi yalnızca bazen uyguladık! Dize karşılaştırması gerektiren
" taggeremail" gibi bir alan strcmp()için, 0 olsa bile sonucunu gerçekten döndürürdük.
Ancak " value" gibi sayısal " " alanlar taggerdateiçin yedeklemeyi uyguladık. Bu yüzden çoklu sıralama testimiz bunu kaçırdı: taggeremailana karşılaştırma olarak kullanıyor .

Şimdi çok daha titiz bir test ekleyerek başlayalım. İki etiketleyici e-postasının, tarihinin ve yeniden adının her bir kombinasyonunu ifade eden bir dizi taahhüdümüz olacak. Sonra sıralamamızın doğru önceliğe uygulandığını doğrulayabiliriz ve hem dize hem de değer karşılaştırıcılarına çarpacağız.

Bu, hatayı gösterir ve düzeltmesi basittir: compare_refs()tüm ref_sortingtuşlar tükendikten sonra yedeklemeyi dış işleve taşımak .

Dış işlevde "ignore_case", her bir ref_sortingöğenin parçası olduğu için bir bayrağımız olmadığını unutmayın . Kullanıcının anahtarlarını eşleştirmek için kullanmadığımız için böyle bir geri dönüşün ne olması gerektiği tartışmalıdır.
Ama şimdiye kadar bu bayrağa saygı duymaya çalışıyoruz, bu yüzden en az invaziv olan şey bunu yapmaya devam etmektir.
Geçerli koddaki tüm arayanlar ya tüm anahtarlar için ya da hiçbiri için bayrağı ayarladığından, bayrağı ilk anahtardan alabiliriz. Kullanıcının gerçekten anahtarların büyük / küçük harf duyarsızlığını ayrı ayrı çevirebileceği varsayımsal bir dünyada, bu durumu bir battaniyeden " --ignore-case" ayırmak için kodu genişletmek isteyebiliriz .


Bu seçenekle uzaktan kumandaları listelemek için ekleyin-r
Troy Daniels

@TroyDaniels Kabul etti. Cevabı düzenleyebilirsiniz. Düzenlemenizi inceleyeceğim.
VonC

19

Göreli bir tarih kullanmayı ve şube adını bu şekilde kısaltmayı seviyorum:

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

Hangi çıktı verir:

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

Tüm favori takma adlarınızı eklemek için bir Bash dosyası oluşturmanızı ve komut dosyasını ekibinize paylaşmanızı öneririm. İşte bunu eklemek için bir örnek:

#!/bin/sh

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

Ardından, güzel biçimlendirilmiş ve sıralanmış bir yerel şube listesi almak için bunu yapabilirsiniz:

git branches

Güncelleme: Renklendirme istiyorsanız bunu yapın:

#!/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)$|$"

Bu bana verirfatal: unknown field name: '-authordate:iso8601'
Factor Mystic

1
Fantezi renkli çıktı fantezi, ama bu basit ve aradığım şey. Uzak dallara bir göz atmak için refs/headsile değiştirin refs/remotes.
Lambart

Komutun kendisi güzel, ama takma ad bir hata atıyor:expansion of alias 'branches' failed; 'echo' is not a git command
Philip Kahn

Benim için çalışıyor. Bunu sadece terminale yapıştırırsanız ne olur? (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'dan itibaren şunları yapabilirsiniz:

git branch --sort=-committerdate

Ayrıca şunları da yapabilirsiniz:

git config branch.sort -committerdate

Bu nedenle, geçerli depodaki dalları her listelediğinizde, committerdate'e göre sıralanır.

Dalları her listelediğinizde, bunların comitterdate'e göre sıralanmasını istiyorsunuz:

git config --global branch.sort -committerdate

Yasal Uyarı: Git'te bu özelliğin yazarıyım ve bu soruyu gördüğümde uyguladım.


2
En güncel cevap, karmaşık komut dosyaları veya takma adlar kullanmaktan çok daha kolay 👌
mtefi

Dikkatle kullanın! Herkese dikkat et, bu dalları listelemek için bir komut değil. Git'in yapılandırmasını değiştirmek için bir komut ve kalıcı küresel yankılara sahip olacak.
Jazimov

1
@Jazimov haklısın, cevabı düzenledim, bu yüzden daha net
user801247

11

Biraz renk ekler ( pretty-formatmevcut olmadığından)

[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

Aynı sorunu yaşadım, bu yüzden Twig adında bir Ruby taşı yazdım . Dalları kronolojik sırayla listeler (ilk önce en yenisi) ve ayrıca tüm dalları listelememeniz için bir maksimum yaş ayarlamanıza izin verebilir (çok sayıda varsa). Örneğin:

$ 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

Ayrıca, her bir dal için özel özellikler (ör. Bilet kimliği, durum, yapılacaklar) depolamanızı ve dallar listesini bu özelliklere göre filtrelemenizi sağlar. Daha fazla bilgi: http://rondevera.github.io/twig/


5
Bu ad, aynı adla birkaç yazılım parçası olduğundan emin olduğum için yardımcı olmayabilir.
thoroc

8

Aşağıdaki komutu buldum (Git 2.13 ve üstü için):

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

Eğer yoksa column, son satırı

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

Çıktı şöyle görünüyor

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

Çeşitli parçaların nasıl çalıştığı hakkında bir blog yazısı yazdım .


Güzel. +1. Kullanımı gelmez git branch --sortbelirtilen I stackoverflow.com/a/33163401/6309 .
VonC

@DanNissenbaum Git 2.13 (Mayıs 2017'de piyasaya sürüldü) veya sonraki sürümlerini kullandığınızdan emin olun.
bdesham


5

Son dallar arasında geçiş yapmak için kullandığım küçük bir komut dosyası:

#!/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

Bu iki takma adı kullanarak:

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

Sadece Git deposunda arayın ve size son N dalını (varsayılan olarak 10) ve her birini bir kenara gösteren bir sayı gösterecektir. Şube sayısını girin ve şunları kontrol edin:

Resim açıklamasını buraya girin


4

Normalde uzak dalları son zamanlarda düşünüyoruz. Öyleyse dene

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

4

İşte diğer tüm komut dosyalarının yaptıklarını yapan başka bir komut dosyası. Aslında, kabuğunuz için bir işlev sağlar.

Katkısı Git yapılandırmanızdan bazı renkler çekmesidir (veya varsayılanları kullanır).

# 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

Bu, saeedgnu'nun sürümüne dayanmaktadır , ancak mevcut dalda bir yıldız ve renk gösterilmektedir ve yalnızca "ay" veya "yıl" olarak tanımlanmayan herhangi bir şey gösterilmektedir:

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

Senaryo olarak en iyi sonucum:

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
Ne tür bir senaryo? Bash?
Peter Mortensen

2

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

Başlangıç ​​tarihine göre sıralanan sadece ilk 5 şube ismini almak isteyen herkes için.



1

İşte aradığım varyasyon:

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

Bu tail -rlisteyi tersine çevirir, böylece en commiterdatesonuncusu sonuncudur.


3
Bunu gerçekleştirmek için --sort = -committerdate öğesini --sort = committerdate olarak da değiştirebilirsiniz.
Ağustos'ta

Hangisi tailvar -r?
Christoffer Hammarström

1

dialogBana interaktif bir liste vermek için , kabul edilen cevaptan çıkan çıktıyı aktarıyorum:

#!/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

(Örneğin) olarak kaydet ~/bin/git_recent_branches.shve chmod +xo. Sonra git config --global alias.rb '!git_recent_branches.sh'bana yeni bir git rbemir ver .


1

Zaten birçok cevap olduğunu biliyorum, ama burada basit bir takma ad için iki sentim (en son şubemi altta tutmayı seviyorum):

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

Bu, mevcut dalınız vurgulanmış olarak (ve bir yıldız işareti vardır) size en son 15 dalınızla ilgili güzel bir genel bakış sunar.


1

Bir takma ad oluşturmaya çalışırken bash_profile'da Mac'te tek tırnak işlerken sorun yaşadı. Bu yanıt, " Tek tırnaklı dizelerdeki tek tırnaklardan nasıl kaçınır?"

Çalışma çözümü:

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 İtibarım nedeniyle yorum yapılamadı


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))' buna ihtiyacın var


0

Git v2.19 tanıttı branch.sortyapılandırma seçeneği (bkz branch.sort ).

Öyleyse git branchvarsayılan olarak değiştirme tarihine (azalan) göre sıralanır

# gitconfig
[branch]
    sort = -committerdate     # desc

senaryo:

$ git config --global branch.sort -committerdate

Güncelleme:

Yani,

$ git branch
* dev
  master
  _

ve

$ git branch -v
* dev    0afecf5 Merge branch 'oc' into dev
  master 652428a Merge branch 'dev'
  _      7159cf9 Merge branch 'bashrc' into dev
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.