Scopri un creatore di filiali Git


159

Voglio scoprire chi ha creato una filiale.

Sono in grado di farlo con:

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

Tuttavia, questo restituisce l'ultimo committer per ramo, non necessariamente la persona che ha creato il ramo.


7
Non puoi ottenere un autore / creatore di succursali in git. Quello che stai facendo qui è ottenere l'autore del suggerimento del ramo. Cambierà non appena qualcuno spingerà un nuovo commit lì.
sylvain.joyeux,

1
Disclaimer: l'assunto implicito in questa domanda / risposta è "in un flusso di lavoro con una sola persona per ramo ". In altri flussi di lavoro in cui almeno due colleghi condividono un ramo, queste informazioni (creatore di ramo) non sono ottenibili tramite git e le risposte di cui sopra potrebbero portare qualcuno a false assunzioni.
Romain Valeri,

Risposte:


56

Un ramo non è altro che un puntatore di commit. Pertanto, non tiene traccia dei metadati come "chi mi ha creato". Guarda tu stesso. Prova cat .git/refs/heads/<branch>nel tuo repository.

Detto ciò, se ti interessa davvero tenere traccia di queste informazioni nel tuo repository, controlla le descrizioni dei rami. Ti consentono di allegare metadati arbitrari ai rami, almeno a livello locale.

Anche la risposta di DarVar di seguito è un modo molto intelligente per ottenere queste informazioni.


Per me questo era in .git / refs / heads / <branch> "ref" era plurale
Jeffrey LeCours

4
La risposta di DarVar, sebbene probabilmente utile ad alcuni, non è una risposta accurata. È semplicemente un modo più conciso di fare ciò che l'autore della domanda originale stava già facendo (vale a dire ottenere il nome dell'ultimo committer in una filiale).
peabody,

296

Elenca le filiali Git remote per autore ordinate per data del committer:

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

8
È l'ultima persona a impegnarsi in quel ramo. Poiché un ramo è solo un puntatore a un commit.
DarVar,

7
Dovrebbe funzionare su Windows? Ho ricevuto "File di input specificato due volte".
Steve Chambers,

27
Con formattazione tabulare: 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 }'(ho avuto un'idea da stackoverflow.com/a/3631819 - potrebbe essere necessario regolare i numeri in awk printf a seconda della lunghezza massima del datetime / nome dell'autore)
Gary S. Weaver

15
Nel caso in cui non ci sia stato alcun commit sul ramo e se è stato creato dal master, l '"autore del ramo" è completamente estraneo al ramo ma solo l'ultimo committer sul master. Se ottieni modifiche dal master ed è un avanzamento veloce, è di nuovo l'ultimo committer sul master, che probabilmente non ha mai lavorato su quel ramo.
Gustave,

9
Sebbene questa risposta e questo comando siano potenzialmente utili, ritengo che sia una risposta fuorviante alla domanda. Questo elenca i nomi degli autori su tutti i rami che sono gli ultimi committer su un ramo. Ci sono un certo numero di circostanze in cui questo non sarebbe effettivamente il creatore del ramo. La vera risposta è che git semplicemente non memorizza queste informazioni.
peabody,

46

Ho modificato le risposte precedenti usando il --sortflag e ho aggiunto un po 'di colore / formattazione:

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

1
perfetto per dare la colpa ai colori
suarsenegger,


8

Aggiungendo alla risposta di DarVar :

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

PS: Abbiamo usato AWK per stampare piuttosto l'autore e il ramo remoto.


3
funziona solo se il nome dell'autore è una sola parola. Se sono separati nome e cognome, vedrai il cognome invece del nome della filiale ...
Legato

5

Puoi scoprire da chi ha creato una filiale nel tuo repository locale

git reflog --format=full

Esempio di output:

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

Ma questo è probabilmente inutile, come in genere nel tuo repository locale solo tu crei filiali.

Le informazioni sono archiviate nel ramo ./.git/logs/refs/heads/ . Contenuto di esempio:

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

L'ultimo commit in questo esempio è stato dell'utente "b" mentre il ramo "b2" è stato creato dall'utente "a". Se cambi il tuo nome utente, puoi verificare che git reflog prende le informazioni dal registro e non usi l'utente locale.

Non conosco alcuna possibilità di trasmettere le informazioni del registro locale a un repository centrale.


4

Possiamo scoprirlo sulla base di authorname

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

1

assumendo:

  1. il ramo è stato fatto da master
  2. non è stato masterancora unito

 git log --format="%ae %an" master..<HERE_COMES_THE_BRANCH_NAME> | tail -1

0

So che questo non è interamente lo scopo della domanda, ma se trovi la necessità di filtrare solo commit di un autore specifico, puoi sempre eseguire il pipe per 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'

buona programmazione! :)


0

per chi cerca un DESC ... questo sembra funzionare --sort=-

Grazie per la formattazione, nuovo per questo ... i miei occhi stanno perdendo parte del suo sangue iniettato

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

ulteriore riferimento: https://stackoverflow.com/a/5188364/10643471


-1

Per quanto ne so, potresti vedere se sei il creatore di un solo ramo. Questo è indicato dalla prima riga in .git / ref / heads / <branch>. Se termina con "Creato da HEAD" sei il creatore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.