Unterschied zwischen Autor und Committer in Git?


235

Ich versuche ein Commit wie zu machen

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

Dabei ist John Doe ein Benutzer, in dessen Namen ich das Commit durchführen möchte.

Es scheint in Ordnung zu sein git log. Wenn ich a mache gitk, ist der Autorenname korrekt, aber der Committer-Name wird aus meinen globalen Git-Konfigurationseinstellungen ausgewählt (und ist daher auf meinen Namen / meine E-Mail-Adresse eingestellt).

Fragen

  1. Was ist der Unterschied zwischen den beiden (Committer vs Autor)?

  2. Sollte ich den Committer auch auf den anderen Benutzer einstellen?

  3. Wenn ja, wie?




Git Committer wird in der .gitconfig-Datei abgelegt. Wenn Sie --author mit dem Namen .gitconfig identisch sind, erhalten Sie nur den Autor in der Festschreibungsnachricht. Wenn sie unterschiedlich sind, erhalten Sie beide.
PoGUIst

Antworten:


214

Das Originalplakat fragt:

Was ist der Unterschied zwischen den beiden (Committer vs Autor)?

Der Autor ist die Person, die den Code ursprünglich geschrieben hat. Als Committer wird hingegen die Person angenommen, die den Code im Namen des ursprünglichen Autors festgeschrieben hat. Dies ist in Git wichtig, da Sie mit Git den Verlauf neu schreiben oder Patches für eine andere Person anwenden können. Das KOSTENLOSE Online Pro Git- Buch erklärt es folgendermaßen:

Sie fragen sich vielleicht, was der Unterschied zwischen Autor und Committer ist . Der Autor ist die Person, die den Patch ursprünglich geschrieben hat, während der Committer die Person ist, die den Patch zuletzt angewendet hat. Wenn Sie also einen Patch an ein Projekt senden und eines der Kernmitglieder den Patch anwendet, erhalten Sie beide eine Gutschrift - Sie als Autor und das Kernmitglied als Committer.

Das Originalplakat fragt:

Sollte ich den Committer auch auf den anderen Benutzer einstellen?

Nein, wenn Sie ehrlich sein möchten, sollten Sie den Committer nicht auf den Autor einstellen, es sei denn, der Autor und der Committer sind tatsächlich dieselbe Person.


1
Ich bin immer noch verwirrt darüber. Ich hatte dies geschehen, und in meinem Fall wurde, soweit mir bekannt ist, nie ein Patch oder ein Verlauf neu geschrieben (es sei denn, einige Git-Befehle erstellen und wenden Patches undurchsichtig "unter der Haube" an). Sind das wirklich die einzigen zwei Möglichkeiten, wie so etwas passieren kann?
Cowlinator

2
Es macht auch keinen Sinn, den Autor als "Person, die den Code geschrieben hat" zu bezeichnen. Wie würde Git wissen, wer es geschrieben hat? Wenn Sie setzen git config userund dann git addund git commit, dann würde git wissen, wer hinzugefügt und wer begangen hat, aber es würde immer noch nicht wissen, wer es geschrieben hat.
Cowlinator

1
@cowlinator Es ist nicht bekannt, wer den Code geschrieben hat. Deshalb musst du es sagen, wenn du es nicht bist. Beachten Sie, dass das vorherige verteilte Versionskontrollsystem vor der Erfindung von git ~~ Linus ~~ die E-Mails des Projektbetreuers mit Patches zum Anwenden gesendet hat. Diese Funktionalität ist vorhanden, damit ~~ Linus ~~ der Betreuer Ihren Patch anwenden kann, während er Sie weiterhin auf "offizielle" Weise und nicht nur ad-hoc in der Festschreibungsnachricht gutschreibt.
Fund Monica Klage

92

Mailingliste + git format-patch+ git applykann Autor generieren! = Committer

In Projekten wie dem Linux-Kernel, in denen sich Patches befinden:

Generieren eines einzelnen neuen Commits mit einem anderen Autor und Committer:

  • Der Autor hat den Patch geschrieben
  • Der Committer ist, wer ein Projektbetreuer ist und wer den Patch zusammengeführt hat

Siehe zum Beispiel diesen zufällig ausgewählten Patch und das entsprechende Commit:

Git-Webschnittstellen wie GitHub und GitLab können einen Autor generieren! = Committer

Da Git (Hub | Lab) sowohl das Upstream- als auch das Fork-Repository auf demselben Computer hält, können sie automatisch alles tun, was Sie auch lokal tun können, einschließlich:

  • Erstellen Sie ein Merge-Commit.

    Erzeugt keinen Autor! = Committer.

    Hält die SHA oder das neue Commit intakt und erstellt ein neues Commit:

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

    In der Vergangenheit war dies die erste verfügbare Methode auf GitHub.

    Vor Ort ist dies erledigt git merge --no-ff.

    Dies erzeugt zwei Commits pro Pull-Anforderung und behält einen Zweig in der Git-Historie.

  • Rebase auf master

    GitHub hackt auch die Commits, um Committer == zu setzen, wer auch immer die Merge-Taste gedrückt hat. Dies ist nicht obligatorisch und wird nicht einmal standardmäßig lokal von durchgeführt git rebase, sondern gibt dem Projektbetreuer Rechenschaft ab.

    Der Git-Baum sieht jetzt so aus:

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

    Das ist genau wie bei den git applyE-Mail-Patches.

Auf GitHub derzeit:

  • Sie wählen die Methode beim Zusammenführen über das Dropdown-Menü auf der Schaltfläche Zusammenführen
  • Methoden können in den Repo-Einstellungen vom Eigentümer aktiviert oder deaktiviert werden

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

Wie setze ich den Committer eines neuen Commits?

Das Beste, was ich finden konnte, war die Verwendung der Umgebungsvariablen, um den Committer zu überschreiben:

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

Wie erhalte ich den Committer und das Commit-Datum eines bestimmten Commits?

Standardmäßig werden nur Autorendaten angezeigt git log.

Um das Datum des Committers anzuzeigen, können Sie entweder:

  • Formatieren Sie das Protokoll speziell dafür:

    git log --pretty='%cn %cd' -n1 HEAD
    

    wo cnund cdstehen für Committer NameundCommitter Date

  • Verwenden Sie das fullervordefinierte Format:

    git log --format=fuller
    

    Siehe auch: So konfigurieren Sie 'git log' so, dass 'Festschreibungsdatum' angezeigt wird

  • Gehen Sie auf eine niedrige Ebene und zeigen Sie die gesamten Festschreibungsdaten an:

    git cat-file -p HEAD
    

Wie lege ich das Committer-Datum eines neuen Commits fest?

git commit --date Legt nur das Autorendatum fest: Für das Committer-Datum war das Beste, was ich finden konnte, die Umgebungsvariable:

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

Siehe auch: Was ist der Unterschied zwischen Autor und Committer in Git?

Wie speichert Git Autor gegen Committer intern?

Siehe: Was ist das Dateiformat eines Git-Commit-Objekts?

Grundsätzlich ist das Commit eine Textdatei und enthält zwei durch Zeilen getrennte Felder:

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

Dies macht deutlich, dass beide zwei völlig unabhängige Dateneinträge im Festschreibungsobjekt sind.


1
Beachten Sie, dass GIT_COMMITTER_*git auch bei Überschreibungen die Durchführung eines Commits verweigert, wenn Sie keinen Standard-Committer mit festgelegt haben git config.
Adelphus

1
@adelphus auf Git 2.5, es funktioniert, wenn Sie beide einstellenGIT_{COMMITTER,AUTHOR}_EMAIL
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

3

@Ciro Santilli use 改造 中心 六四 事件 法轮功vorgeschlagen zu verwenden

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

Um zu vermeiden, dass Name und E-Mail wiederholt werden, können Sie sie wiederverwenden

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

Dadurch werden die Variablen zuerst in separaten Befehlen festgelegt und dann für den git commitAufruf verwendet (beachten Sie die doppelten Klammern).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.