Różnica między autorem a autorem w Git?


236

Próbuję zrobić coś w rodzaju zatwierdzenia

git commit --author="John Doe <john@doe.com>" -m "<the usual commit message>"

gdzie John Doe to użytkownik, którego imię chcę dokonać zatwierdzenia.

Wygląda na to, że wszystko w porządku git log. Jednak gdy wykonam a gitk, nazwa autora jest poprawna, ale nazwa osoby odpowiedzialnej jest wybierana z moich globalnych ustawień konfiguracji git (i dlatego jest ustawiona na moje imię / adres e-mail).

pytania

  1. Jaka jest różnica między nimi (osoba odpowiedzialna a autor)?

  2. Czy powinienem ustawić także osobę odpowiedzialną za komunikację również innemu użytkownikowi?

  3. Jeśli tak to jak?




Committer Git jest umieszczony w pliku .gitconfig. Jeśli --author jest taki sam jak nazwa .gitconfig, w komunikacie zatwierdzenia pojawia się tylko autor. Jeśli różnią się, otrzymasz oba.
poGUIst

Odpowiedzi:


215

Oryginalny plakat pyta:

Jaka jest różnica między nimi (Committer vs autor)?

Autor jest osobą, która pierwotnie napisała kod. Z drugiej strony przyjmuje się, że osoba odpowiedzialna jest za osobę, która popełniła kod w imieniu oryginalnego autora. Jest to ważne w Git, ponieważ Git umożliwia przepisywanie historii lub stosowanie łatek w imieniu innej osoby. Darmo w Internecie Pro Git książka wyjaśnia to tak:

Być może zastanawiasz się, jaka jest różnica między autora i committer . Autor jest osobą, która pierwotnie napisał łatkę, natomiast committer jest osoba, która ostatnia zastosowała poprawki. Tak więc, jeśli wyślesz łatkę do projektu, a jeden z głównych członków zastosuje łatkę, oboje dostaniesz kredyt - ty jako autor, a główny członek jako zlecający.

Oryginalny plakat pyta:

Czy powinienem ustawić także osobę odpowiedzialną za komunikację również innemu użytkownikowi?

Nie, jeśli chcesz być szczery, nie powinieneś przypisywać autora do autora, chyba że autor i autor są w rzeczywistości tą samą osobą.


1
Nadal jestem tym zmieszany. Zdarzyło mi się to iw moim przypadku, o ile mi wiadomo, nigdy nie zdarzyło się, aby łatka lub historia zostały przepisane (chyba że niektóre polecenia git tworzą i stosują łaty, nieprzezroczysto „pod maską”). Czy to naprawdę jedyne 2 sposoby, aby coś takiego się wydarzyło?
cowlinator

2
Nazywanie autora „osobą, która napisała kod” nie ma sensu. Skąd miałby wiedzieć, kto to napisał? Kiedy ustawisz, git config usera potem git addi git commitwtedy, git będzie wiedział, kto dodał, a kto popełnił, ale nadal nie będzie wiedział, kto to napisał.
cowlinator

1
@cowlinator Nie wie, kto napisał kod. Dlatego musisz to powiedzieć, jeśli to nie ty. Należy pamiętać, że poprzedni rozproszony system kontroli wersji przed wynalezieniem git wysyłał ~~ Linus ~~ e-mail opiekuna projektu z łatkami do zastosowania. Ta funkcja jest dostępna, więc ~~ Linus ~~ opiekun może zastosować łatkę, jednocześnie przypisując ci ją w „oficjalny” sposób, a nie tylko ad-hoc w komunikacie zatwierdzenia.
Pozew Fund Moniki w

92

Lista mailingowa + git format-patch+ git applymoże generować autora! = Committer

W projektach takich jak jądro Linuksa, w których znajdują się łatki:

generowanie jednego nowego zatwierdzenia z innym autorem i podmiotem zatwierdzającym:

  • to autor napisał łatkę
  • podmiot odpowiedzialny jest tym, który jest opiekunem projektu i który połączył łatkę

Zobacz na przykład tę losowo wybraną poprawkę i odpowiadający jej zatwierdzenie:

Interfejsy internetowe Git, takie jak GitHub i GitLab, mogą generować autor!

Ponieważ Git (Hub | Lab) przechowuje zarówno repozytoria nadrzędne, jak i widełkowe na tej samej maszynie, mogą one automatycznie robić wszystko, co można zrobić lokalnie, w tym:

  • Utwórz zatwierdzenie scalania.

    Nie generuje autora! = Committer.

    Utrzymuje SHA lub nowe zatwierdzenie nienaruszone i tworzy nowe zatwierdzenie:

    * Merge commit (committer == author == project maintainer)
    |\
    | * Feature commit (committer == author == contributor)
    |/
    * Old master (random committer and author)
    

    Historycznie była to pierwsza dostępna metoda na GitHub.

    Lokalnie odbywa się to za pomocą git merge --no-ff.

    Powoduje to dwa zatwierdzenia na żądanie ściągnięcia i zachowuje rozwidlenie w historii git.

  • rebase na górze master

    GitHub włamuje się również do commits, aby ustawić committer == ktokolwiek nacisnął przycisk scalania. Nie jest to obowiązkowe i nie jest nawet domyślnie wykonywane lokalnie przez git rebase, ale daje rozliczalność opiekunowi projektu.

    Drzewo git wygląda teraz następująco:

    * Feature commit (committer == maintainer, author == contributor)
    |
    * Old master (random committer and author)    
    

    który jest dokładnie taki jak w git applyłatkach e-mail.

Obecnie na GitHub:

  • metodę wybierasz podczas scalania za pomocą menu rozwijanego na przycisku scalania
  • metody mogą być włączone lub wyłączone w ustawieniach repo przez właściciela

https://help.github.com/articles/about-merge-methods-on-github/

Jak ustawić moduł zatwierdzający nowego zatwierdzenia?

Najlepsze, co mogłem znaleźć, to użycie zmiennych środowiskowych do zastąpienia obiektu polecającego:

GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a <a>'

Jak uzyskać datę zatwierdzenia i zatwierdzenia danego zatwierdzenia?

Domyślnie wyświetlane są tylko dane autora git log.

Aby zobaczyć datę zleceniodawcy, możesz:

Jak ustawić datę zatwierdzenia nowego zatwierdzenia?

git commit --date ustawia tylko datę autora: dla daty osoby odpowiedzialnej najlepiej znalazłem zmienną środowiskową:

GIT_COMMITTER_DATE='2000-01-01T00:00:00+0000' git commit --date='2000-01-01T00:00:00+0000'

Zobacz także: Jaka jest różnica między autorem a autorem w Git?

Jak Git przechowuje wewnętrznie autora kontra autora?

Zobacz: Jaki jest format pliku obiektu git commit?

Zasadniczo zatwierdzenie jest plikiem tekstowym i zawiera dwa pola oddzielone liniami:

author {author_name} <{author_email}> {author_date_seconds} {author_date_timezone}
committer {committer_name} <{committer_email}> {committer_date_seconds} {committer_date_timezone}

To wyjaśnia, że ​​oba są dwoma całkowicie niezależnymi wpisami danych w obiekcie zatwierdzenia.


1
Zauważ, że nawet w przypadku GIT_COMMITTER_*przesłonięć, git nadal odmówi wykonania zatwierdzenia, jeśli nie ustawiłeś domyślnego committera za pomocą git config.
adelphus

1
@adelphus na Git 2.5, to działa, jeśli ustawisz obaGIT_{COMMITTER,AUTHOR}_EMAIL
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

3

@Ciro Santilli 新疆 改造 中心 六四 事件 法轮功zaproponował użycie

GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a <a>'

Aby uniknąć powtarzania nazwy i adresu e-mail, możesz ich ponownie użyć

GIT_COMMITTER_NAME='a'; GIT_COMMITTER_EMAIL='a'; git commit --author "$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"

który najpierw ustawia zmienne w osobnych poleceniach, a następnie wykorzystuje je do git commitwywołania (zwróć uwagę na podwójne nawiasy).

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.