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łąź.


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.


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

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

1
idealne do obwiniania kolorów
suarsenegger


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łąź.


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.


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

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

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! :)


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


-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ą.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.