Quero obter uma lista de todas as ramificações em um repositório Git com as ramificações "mais recentes" na parte superior, onde a ramificação "mais recente" é a que foi confirmada mais recentemente (e, portanto, é mais provável que seja uma delas). Eu quero prestar atenção).
Existe uma maneira de usar o Git para (a) classificar a lista de ramificações pela última confirmação ou (b) obter uma lista de ramificações com a data da última confirmação de cada um, em algum tipo de formato legível por máquina?
Na pior das hipóteses, eu sempre poderia executar git branch
para obter uma lista de todas as ramificações, analisar sua saída e, em seguida, git log -n 1 branchname --format=format:%ci
para cada uma, para obter a data de consolidação de cada ramificação. Mas isso será executado em uma caixa do Windows, onde iniciar um novo processo é relativamente caro, portanto, iniciar o executável do Git uma vez por filial pode ficar lento se houver muitas ramificações. Existe uma maneira de fazer tudo isso com um único comando?
fonte
git for-each-ref
de Jakub Narębski: você pode obter ramificações remotas emrefs/remotes/
vez derefs/heads/
(ou você pode passar ambas, separadas por espaços em branco);refs/tags/
para tags ou apenasrefs/
para os três tipos.for-each-ref
! Você usará diretamentegit branch --sort=-committerdate
: veja minha resposta abaixoRespostas:
Use a
--sort=-committerdate
opção degit for-each-ref
;Também disponível desde o Git 2.7.0 para
git branch
:Uso básico:
Resultado:
Uso avançado:
Resultado:
fonte
--format=%(refname)
.git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname) %(committerdate) %(authorname)' | sed 's/refs\/heads\///g'
:shortname
?git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/
. A página de manual do git-for-each-ref (1) diz: Para um nome abreviado não ambíguo do ap ap ref:short
.[alias]
seção e eu adoro isso.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))'
Lista de nomes de ramificações Git, ordenados pela confirmação mais recente…
Expandindo a resposta de Jakub e a dica de Joe , o seguinte removerá os "refs / heads /" para que a saída exiba apenas os nomes das ramificações:
Comando:
Resultado:
fonte
--format=%(refname:short)
vez de confiarcut
.git rb
lembrar a cercar o comando entre aspas:git config --global alias.rb "for-each-ref --count=20 --sort=-committerdate refs/heads/ --format=\'%(refname:short)\'"
git branch
, portanto, obter local, remoto ou todos os ramos funciona como no git-branch (ou seja, -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))'
Aqui está o código ideal, que combina as outras duas respostas:
fonte
git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'
Aqui está um comando simples que lista todas as ramificações com as confirmações mais recentes:
Para solicitar pela confirmação mais recente, use
Fonte: http://git-scm.com/book/en/Git-Branching-Branch-Management
fonte
git branch -av
se você quiser ver ramificações não locais também.git branch -v
incluir a data de cada confirmação listada?git branch -va --sort=-committerdate
de mostrar ramificações não locais, com as ramificações alteradas mais recentemente no topo.Eu uso o seguinte alias:
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"
que produz:
Use '|' separar.
fonte
column -ts'|'
que os caracteres de vírgula possam ocorrer dentro de carimbos de data e hora relativos no seu código do idioma.'%(HEAD) ...'
no início da cadeia de formato para obter o mesmo efeito sem tubulação pensamento dosed
comando[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'|'
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'|'}
Consegui fazer referência aos exemplos anteriores para criar algo que funcione melhor para mim.
fonte
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))'
Eu também precisava de cores, tags e referências remotas sem duplicatas:
Como as cotações podem ser difíceis, eis o alias para o Bash:
fonte
| head -n20
no final. Se você estiver usando o alias, verifique se está dentro das aspas.As outras respostas não parecem permitir a passagem
-vv
a obtenha uma saída detalhada.Então, aqui está uma lista que classifica
git branch -vv
por data de confirmação, preservando a cor etc:Se você desejar imprimir adicionalmente a data de confirmação, poderá usar esta versão:
Saída de amostra:
Provavelmente é mais legível dividido em várias linhas:
Isso também deve funcionar com outros argumentos para
git branch
, por exemplo,-vvr
listar ramificações de rastreamento remoto ou-vva
listar ramificações de rastreamento remoto e locais.fonte
-vv
pode ser realmente útil, obrigado. No entanto, essa solução ainda gera novos processos para cada filial, que o OP queria evitar.git branch
, não define especificamente o significado de-vv
, mas apenas de-v
, portanto,-vv
deve ter o mesmo que-v
.-v, -vv, --verbose
contém o seguinte:If given twice, print the name of the upstream branch, as well
O git 2.7 (quarto trimestre de 2015) introduzirá a classificação de ramificação usando diretamente
git branch
:Consulte commit aa3bc55 , commit aedcb7d , commit 1511b22 , commit f65f139 , ... (23 de setembro de 2015), commit aedcb7d , commit 1511b22 , commit ca41799 (24 set 2015) e confirmar f65f139 , ... (23 de setembro de 2015) por Karthik Nayak (
KarthikNayak
) .(Mesclado por Junio C Hamano -
gitster
- no commit 7f11b48 , 15 de outubro de 2015)Em particular, confirme aedcb7d :
Crie APIs '
branch.c
' use 'ref-filter
' para iterar através da classificação refs. Isso remove a maior parte do código usado em "branch.c
" substituí-lo por chamadas para aref-filter
biblioteca " ".Ele adiciona a opção
--sort=<key>
:Aqui:
Ou (veja abaixo com Git 2.19)
Veja também commit 9e46833 (30 de outubro de 2015) por Karthik Nayak (
KarthikNayak
) .Ajudado por: Junio C Hamano (
gitster
) .(Mesclado por Junio C Hamano -
gitster
- na confirmação 415095f , 03 de novembro de 2015)Com o Git 2.19, a ordem de classificação pode ser definida por padrão.
git branch
suporta uma configuraçãobranch.sort
, comogit tag
, que já tinha uma configuraçãotag.sort
.Veja commit 560ae1c (16 ago 2018) por Samuel Maftoul (``) .
(Mesclado por Junio C Hamano -
gitster
- in commit d89db6f , 27 de agosto de 2018)Para listar ramificações remotas, use
git branch -r --sort=objectsize
. O-r
sinalizador faz com que ele aliste ramificações remotas em vez de ramificações locais.Com o Git 2.27 (segundo trimestre de 2020) ",
git branch
for-each-ref
variantes " e outras " " aceitaram várias--sort=<key>
opções na ordem crescente de precedência, mas houve algumas falhas "--ignore-case
" falhas no manuseio e empate com o refname, que foram corrigidos.Consulte commit 7c5045f , commit 76f9e56 (03 de maio de 2020) por Jeff King (
peff
) .(Mesclado por Junio C Hamano -
gitster
- no commit 6de1630 , 08 de maio de 2020)fonte
-r
Eu gosto de usar uma data relativa e encurtar o nome do ramo assim:
O que fornece saída:
Eu recomendo criar um arquivo Bash para adicionar todos os seus aliases favoritos e depois compartilhar o script para sua equipe. Aqui está um exemplo para adicionar apenas este:
Em seguida, você pode fazer isso para obter uma lista de filiais locais bem formatada e classificada:
Atualização: Faça isso se quiser colorir:
fonte
fatal: unknown field name: '-authordate:iso8601'
refs/heads
porrefs/remotes
para dar uma olhada nas ramificações remotas.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)$|$"
A partir do Git 2.19, você pode simplesmente:
Você também pode:
Portanto, sempre que você listar ramificações no repositório atual, ele será listado classificado por data de envio.
Se, sempre que você listar ramificações, você desejar que elas sejam classificadas por data do emissor:
Isenção de responsabilidade: sou o autor desse recurso no Git e o implementei quando vi essa pergunta.
fonte
Adiciona um pouco de cor (já que
pretty-format
não está disponível)fonte
Eu tinha o mesmo problema, então escrevi uma gema Ruby chamada Twig . Ele lista ramificações em ordem cronológica (a mais nova primeiro) e também permite definir uma idade máxima para não listar todas as ramificações (se houver muitas). Por exemplo:
Também permite armazenar propriedades personalizadas para cada filial, por exemplo, ID do ticket, status, todos e filtrar a lista de agências de acordo com essas propriedades. Mais informações: http://rondevera.github.io/twig/
fonte
Eu vim com o seguinte comando (para Git 2.13 e posterior):
Se você não possui,
column
pode substituir a última linha porA saída parece
Eu escrevi um post sobre como as várias peças funcionam.
fonte
git branch --sort
eu mencionei em stackoverflow.com/a/33163401/6309 .Para sua informação, se você deseja obter uma lista dos ramos que fizeram check-out recentemente (em vez dos que foram confirmados recentemente), pode usar o reflog do Git:
Veja também: Como posso obter uma lista dos ramos do Git que fiz check-out recentemente?
fonte
Aqui está um pequeno script que eu uso para alternar entre ramificações recentes:
Usando esses dois aliases:
Apenas chame isso em um repositório Git, e ele mostrará os últimos N ramos (10 por padrão) e um número de lado cada um. Insira o número da ramificação e faça o check-out:
fonte
Normalmente, consideramos os ramos remotos recentemente. Então tente isso
fonte
Aqui está outro script que faz o que todos os outros scripts fazem. De fato, ele fornece uma função para o seu shell.
Sua contribuição é que ele extrai algumas cores da sua configuração do Git (ou usa padrões).
fonte
Isso é baseado na versão do saeedgnu , mas com o ramo atual mostrado com uma estrela e em cores e mostrando apenas algo que não foi descrito como "meses" ou "anos" atrás:
fonte
Meu melhor resultado como um script:
fonte
git branch --sort=-committerdate | head -5
Para qualquer pessoa interessada em obter apenas os 5 principais nomes de agências, classificados com base na data do emissor.
fonte
A resposta da linha de comando aceita é ótima, mas se você quiser algo mais bonito, como uma GUI, e sua origem === "github".
Você pode clicar em "Ramos" no repositório. Ou acesse o URL diretamente: https://github.com/ORGANIZATION_NAME/REPO_NAME/branches
fonte
Aqui está a variação que eu estava procurando:
Isso
tail -r
inverte a lista para que a mais recentecommiterdate
seja a última.fonte
tail
tem-r
?Canalizo a saída da resposta aceita
dialog
para uma lista interativa:Salvar como (por exemplo)
~/bin/git_recent_branches.sh
echmod +x
ele. Então,git config --global alias.rb '!git_recent_branches.sh'
para me dar um novogit rb
comando.fonte
Eu sei que já existem muitas respostas, mas aqui estão meus dois centavos para um alias simples (eu gosto de ter minha ramificação mais recente na parte inferior):
Isso fornecerá uma boa visão geral dos seus 15 ramos mais recentes, em cores, com o ramo atual realçado (e possui um asterisco).
fonte
Ocorreu algum problema ao lidar com aspas simples no Mac no bash_profile ao tentar definir um alias. Esta resposta ajudou a resolvê-lo " Como escapar de aspas simples em cadeias de caracteres entre aspas simples
Solução de trabalho:
PS Não foi possível comentar por causa da minha reputação
fonte
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))'
é isso que você precisafonte
O Git v2.19 apresenta a
branch.sort
opção de configuração (consulte branch.sort ).Por isso
git branch
, classificará por data do committer (desc) por padrão comroteiro:
Atualizar:
Assim,
e
fonte