Poznaj twórcę gałęzi Git

159

Chcę się dowiedzieć, kto stworzył oddział.

Jestem w stanie to zrobić z:

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

Jednak zwraca to ostatniego zatwierdzającego na gałąź, niekoniecznie osobę, która utworzyła gałąź.

Ofir Farchy
źródło
7
Nie możesz pobrać autora / twórcy gałęzi w git. To, co tu robisz, to zdobycie wskazówki od autora oddziału. Zmieni się, gdy tylko ktoś wprowadzi tam nowe zatwierdzenie.
sylvain.joyeux
1
Zastrzeżenie: Ukryte założenie w tym pytaniu / odpowiedzi brzmi „w przepływie pracy z tylko jedną osobą na oddział ”. W innych przepływach pracy, w których co najmniej dwóch współpracowników współdzieli oddział, ta informacja (twórca oddziału) nie jest dostępna za pośrednictwem git, a powyższe odpowiedzi mogą doprowadzić kogoś do fałszywych założeń.
RomainValeri

Odpowiedzi:

56

Gałąź to nic innego jak wskaźnik zatwierdzenia. W związku z tym nie śledzi metadanych, takich jak „kto mnie stworzył”. Sam zobacz. Spróbuj cat .git/refs/heads/<branch>w swoim repozytorium.

To napisane, jeśli naprawdę chcesz śledzić te informacje w swoim repozytorium, sprawdź opisy gałęzi. Umożliwiają one dołączanie dowolnych metadanych do gałęzi, przynajmniej lokalnie.

Również poniższa odpowiedź DarVara to bardzo sprytny sposób na uzyskanie tych informacji.

Krzysztof
źródło
Dla mnie to było w .git / refs / heads / <branch> "ref" był w liczbie mnogiej
Jeffrey LeCours,
4
Odpowiedź DarVara, choć prawdopodobnie przydatna dla niektórych, nie jest dokładną odpowiedzią. Jest to po prostu bardziej zwięzły sposób zrobienia tego, co autor pierwotnego pytania już robił (mianowicie przeniesienia nazwiska ostatniego komendanta do gałęzi).
peabody
296

Wyświetl listę zdalnych gałęzi Git według autora posortowane według daty autora:

git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' --sort=committerdate
DarVar
źródło
8
To ostatnia osoba, która zaangażuje się w tę gałąź. Ponieważ gałąź jest tylko wskaźnikiem do zatwierdzenia.
DarVar
7
Czy to powinno działać w systemie Windows? Otrzymałem „Plik wejściowy określono dwa razy”.
Steve Chambers,
27
Z formatowaniem tabelarycznym: 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 }'(pomysł ze stackoverflow.com/a/3631819 - może być konieczne dostosowanie liczb w wydruku awk w zależności od maksymalnej długości datetime / nazwisk autorów)
Gary S. Weaver
15
W przypadku, gdy nie było żadnego zatwierdzenia w gałęzi i jeśli zostało ono utworzone z mastera, "autor gałęzi" jest całkowicie niezwiązany z tą gałęzią, ale tylko ostatni komitter na master. Jeśli ściągniesz zmiany z mastera i to szybko do przodu, to znowu jest to ostatni komiter na master, który prawdopodobnie nigdy nie pracował nad tą gałęzią.
Gustave
9
Chociaż ta odpowiedź i polecenie są potencjalnie przydatne, uważam, że jest to myląca odpowiedź na to pytanie. Wyświetla nazwiska autorów we wszystkich gałęziach, którzy są ostatnimi zatwierdzającymi w gałęzi. Istnieje wiele okoliczności, w których to faktycznie nie byłby twórca branży. Prawdziwą odpowiedzią jest to, że git po prostu nie przechowuje tych informacji.
peabody,
46

Poprawiłem poprzednie odpowiedzi, używając --sortflagi i dodałem trochę koloru / formatowania:

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
Mikrofon
źródło
1
idealne do obwiniania kolorów
suarsenegger
8
git for-each-ref --format='%(authorname) %09 -%(refname)' | sort
KhaledMohamed P.
źródło
8

Dodając do odpowiedzi DarVar :

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

PS: Użyliśmy AWK, aby ładnie wydrukować autora i zdalną gałąź.

suryakrupa
źródło
3
działa tylko wtedy, gdy nazwisko autora jest jednym słowem. Jeśli imię i nazwisko są rozdzielone, zobaczysz nazwisko zamiast nazwy oddziału ...
Legato
5

Możesz dowiedzieć się, kto utworzył oddział w lokalnym repozytorium, korzystając z adresu

git reflog --format=full

Przykładowe dane wyjściowe:

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

Ale jest to prawdopodobnie bezużyteczne, ponieważ zazwyczaj w lokalnym repozytorium tworzysz tylko gałęzie.

Informacje są przechowywane pod adresem ./.git/logs/refs/heads/ branch . Przykładowa treść:

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

Ostatnie zatwierdzenie w tym przykładzie pochodziło od użytkownika „b”, podczas gdy gałąź „b2” została utworzona przez użytkownika „a”. Jeśli zmienisz swoją nazwę użytkownika, możesz sprawdzić, czy git reflog pobiera informacje z dziennika i nie używa lokalnego użytkownika.

Nie wiem o żadnej możliwości przesłania informacji z lokalnego dziennika do centralnego repozytorium.

Gustaw
źródło
4

Możemy dowiedzieć się na podstawie nazwiska autora

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

Zarozumiały:

  1. gałąź została wykonana z master
  2. nie został masterjeszcze scalony z

 git log --format="%ae %an" master..<HERE_COMES_THE_BRANCH_NAME> | tail -1
Trident D'Gao
źródło
0

Wiem, że to nie jest do końca zakres pytania, ale jeśli znajdziesz potrzebę filtrowania tylko zatwierdzeń określonego autora, zawsze możesz przejść do 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'

miłego kodowania! :)

avocadojesus
źródło
0

dla tych, którzy szukają DESC ... to wydaje się działać --sort=-

ty za formatowanie, nowość w tym ... moje oczy tracą trochę przekrwione oczy

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

dalej: https://stackoverflow.com/a/5188364/10643471

Rob bee
źródło
-1

O ile wiem, możesz zobaczyć, czy jesteś twórcą tylko gałęzi. Wskazuje na to pierwszy wiersz w .git / ref / heads / <branch>. Jeśli kończy się na „Utworzono z HEAD”, jesteś twórcą.

Kendor
źródło