Descubra um criador de ramificações Git

158

Eu quero descobrir quem criou um ramo.

Eu sou capaz de fazer isso com:

git branch -a | xargs -L 1 bash -c 'echo "$1 `git log --pretty=format:"%H %an" $1^..$1`"' _

No entanto, isso retorna o último commit por ramificação, não necessariamente a pessoa que criou a ramificação.

Ofir Farchy
fonte
7
Você não pode obter um autor / criador de ramificação no git. O que você está fazendo aqui é obter o autor da dica da agência. Isso mudará assim que alguém enviar um novo commit para lá.
precisa saber é o seguinte
1
Isenção de responsabilidade: A suposição implícita nesta pergunta / resposta está "em um fluxo de trabalho com apenas uma pessoa por filial ". Em outros fluxos de trabalho em que pelo menos dois colegas de trabalho compartilham uma ramificação, essas informações (criador da ramificação) não são obtidas pelo git, e as respostas acima podem levar alguém a falsas suposições.
RomainValeri 12/06/19

Respostas:

56

Uma ramificação não passa de um ponteiro de confirmação. Como tal, não rastreia metadados como "quem me criou". Veja por si mesmo. Experimente cat .git/refs/heads/<branch>no seu repositório.

Dito isso, se você realmente deseja rastrear essas informações em seu repositório, consulte as descrições dos ramos. Eles permitem anexar metadados arbitrários às ramificações, pelo menos localmente.

Também a resposta da DarVar abaixo é uma maneira muito inteligente de obter essas informações.

Christopher
fonte
Para mim, isso foi em .git / refs / heads / <ramo> "ref" era plural
Jeffrey lecours
4
A resposta de DarVar, embora provavelmente seja útil para alguns, não é uma resposta precisa. É simplesmente uma maneira mais sucinta de fazer o que o autor da pergunta original já estava fazendo (ou seja, levar o nome do último commiter para um ramo).
Peabody
295

Lista ramificações remotas do Git por autor, classificadas por data do committer:

git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' --sort=committerdate
DarVar
fonte
8
É a última pessoa a se comprometer com esse ramo. Como um ramo é apenas um ponteiro para um commit.
DarVar 13/01
7
Isso deve funcionar no Windows? Recebi "Arquivo de entrada especificado duas vezes".
Steve Chambers
27
Com formatação tabular: git for-each-ref --format='%(committerdate)%09%(authorname)%09%(refname)' | sort -k5n -k2M -k3n -k4n | grep remotes | awk -F "\t" '{ printf "%-32s %-27s %s\n", $1, $2, $3 }'(ideia tem de stackoverflow.com/a/3631819 - pode ser necessário ajustar os números no printf awk dependendo comprimentos datetime / nome do autor max)
Gary S. tecelão
15
Caso não tenha havido nenhum commit no branch e se ele foi criado a partir do master, o "autor do branch" não tem nenhuma relação com esse branch, mas apenas o último commit no master. Se você obtém alterações do mestre e é um avanço rápido, é novamente o último commit no mestre, que possivelmente nunca trabalhou nesse ramo.
Gustave
9
Embora essa resposta e comando sejam potencialmente úteis, acho que é uma resposta enganosa à pergunta. Isso lista nomes de autores em todas as ramificações que são o último commiter em uma ramificação. Existem várias circunstâncias em que isso não seria realmente o criador do ramo. A resposta real é que o git simplesmente não armazena essas informações.
Peabody
46

Ajustei as respostas anteriores usando a --sortbandeira e adicionei um pouco de cor / formatação:

git for-each-ref --format='%(color:cyan)%(authordate:format:%m/%d/%Y %I:%M %p)    %(align:25,left)%(color:yellow)%(authorname)%(end) %(color:reset)%(refname:strip=3)' --sort=authordate refs/remotes
Mike
fonte
1
perfeito para culpar cores
suarsenegger
8
git for-each-ref --format='%(authorname) %09 -%(refname)' | sort
KhaledMohamedP
fonte
8

Adicionando à resposta do DarVar :

git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -k5n -k2M -k3n -k4n | awk '{print $7 $8}'

PS: Usamos o AWK para imprimir bastante o autor e o ramo remoto.

suryakrupa
fonte
3
isso só funciona se o nome do autor for uma única palavra. Se ele é o primeiro e último nomes separados, então você vai ver o último nome em vez do nome do ramo ...
Legato
5

Você pode descobrir quem criou uma ramificação em seu repositório local ,

git reflog --format=full

Exemplo de saída:

commit e1dd940
Reflog: HEAD@{0} (a <a@none>)
Reflog message: checkout: moving from master to b2
Author: b <b.none>
Commit: b <b.none>
(...)

Mas isso provavelmente é inútil, pois normalmente em seu repositório local, apenas você cria ramificações.

As informações são armazenadas em ./.git/logs/refs/heads/ branch . Exemplo de conteúdo:

0000000000000000000000000000000000000000 e1dd9409c4ba60c28ad9e7e8a4b4c5ed783ba69b a <a@none> 1438788420 +0200   branch: Created from HEAD

A última confirmação neste exemplo foi do usuário "b" enquanto a ramificação "b2" foi criada pelo usuário "a". Se você alterar seu nome de usuário, poderá verificar se o git reflog obtém as informações do log e não usa o usuário local.

Não conheço nenhuma possibilidade de transmitir essas informações de log local para um repositório central.

Gustave
fonte
4

Podemos descobrir com base no authorname

git for-each-ref --format='%(authorname) %09 %(if)%(HEAD)%(then)*%(else)%(refname:short)%(end) %09 %(creatordate)' refs/remotes/ --sort=authorname DESC
tech2504
fonte
1

Assumindo:

  1. ramo foi feito de master
  2. não foi fundiram para masterainda

 git log --format="%ae %an" master..<HERE_COMES_THE_BRANCH_NAME> | tail -1
Trident D'Gao
fonte
0

Eu sei que esse não é inteiramente o escopo da pergunta, mas se você achar que é necessário filtrar apenas commits por um autor específico, sempre poderá canalizar para grep :)

# lists all commits in chronological order that
# belong to the github account with
# username `MY_GITHUB_USERNAME` (obviously you
# would want to replace that with your github username,
# or the username you are trying to filter by)


git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -committerdate | grep 'MY_GITHUB_USERNAME'

feliz codificação! :)

avocadojesus
fonte
0

para quem procura um DESC ... parece funcionar --sort=-

tipo de formatação, novo nisso ... meus olhos estão perdendo um pouco de sangue

git for-each-ref --format='%(color:cyan)%(authordate:format:%m/%d/%Y %I:%M %p)    %(align:25,left)%(color:yellow)%(authorname)%(end) %(color:reset)%(refname:strip=3)' --sort=-authordate refs/remotes

ref mais: https://stackoverflow.com/a/5188364/10643471

roubar abelha
fonte
-1

Tanto quanto eu sei, você pode ver se você é o criador de apenas um ramo. Isso é indicado pela primeira linha em .git / ref / heads / <branch>. Se terminar com "Created from HEAD", você será o criador.

Kendor
fonte