¿Diferencia entre autor y committer en Git?


237

Estoy tratando de hacer un compromiso como

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

donde John Doe es un usuario en cuyo nombre quiero hacer la confirmación.

Parece estar bien adentro git log. Sin embargo, cuando hago un gitk, el nombre del autor es correcto, pero el nombre del confirmador se selecciona de mi configuración global de configuración de git (y, por lo tanto, se establece en mi nombre / correo electrónico).

Preguntas

  1. ¿Cuál es la diferencia entre los dos (committer vs author)?

  2. ¿Debería configurar el committer también para el otro usuario?

  3. Si es así, ¿cómo?




Git committer se coloca en el archivo .gitconfig. Si su autor es el mismo que .gitconfig name, solo obtendrá el autor en el mensaje de confirmación. Si son diferentes, obtienes ambos.
poGUIst

Respuestas:


216

El póster original pregunta:

¿Cuál es la diferencia entre los dos (Committer vs author)?

El autor es la persona que originalmente escribió el código. Por otra parte, se supone que el que comete es la persona que cometió el código en nombre del autor original. Esto es importante en Git porque Git le permite reescribir el historial o aplicar parches en nombre de otra persona. El libro en línea Pro Git GRATIS lo explica así:

Tal vez se pregunte cuál es la diferencia entre autor y responsable . El autor es la persona que originalmente escribió el parche, mientras que el confirmador es la última persona que aplica el parche. Por lo tanto, si envía un parche a un proyecto y uno de los miembros principales aplica el parche, ambos obtendrán crédito: usted como autor y el miembro central como responsable.

El póster original pregunta:

¿Debería configurar el committer también para el otro usuario?

No, si quieres ser honesto, no deberías configurar el committer para el autor, a menos que el autor y el committer sean de hecho la misma persona.


1
Todavía estoy confundido sobre esto. Tuve que pasar esto, y en mi caso, hasta donde yo sé, nunca se produjo ningún parche o reescritura del historial (a menos que algunos comandos git creen y apliquen parches, de forma opaca, "debajo del capó"). ¿Esas son realmente las únicas 2 formas de que suceda algo como esto?
Cowlinator

2
Además, llamar al autor la "persona que escribió el código" no tiene sentido. ¿Cómo sabría git quién lo escribió? Cuando configuras git config usery luego git addy git commit, entonces git sabría quién agregó y quién cometió, pero aún no sabría quién lo escribió.
Cowlinator

1
@cowlinator No sabe quién escribió el código. Es por eso que tienes que decirlo, si no eres tú. Tenga en cuenta que el sistema de control de versiones distribuido anterior a la invención de git estaba enviando ~~ Linus ~~ los correos electrónicos del responsable del proyecto con parches para aplicar. Esta funcionalidad está ahí, así que ~~ Linus ~~ el mantenedor puede aplicar su parche sin dejar de acreditarlo de manera 'oficial', en lugar de solo ad-hoc en el mensaje de confirmación.
Financia la demanda de Mónica el

92

La lista de correo + git format-patch+ git applypuede generar author! = Committer

En proyectos como el kernel de Linux donde los parches son:

generando una nueva confirmación con diferentes autores y confirmadores:

  • el autor es quien escribió el parche
  • el confirmador es quién mantiene el proyecto y quién fusionó el parche

Vea, por ejemplo, este parche seleccionado al azar y la confirmación correspondiente:

¡Las interfaces web de Git como GitHub y GitLab pueden o no generar autor! = Committer

Dado que Git (Hub | Lab) mantiene los repositorios ascendentes y bifurcados en la misma máquina, pueden hacer automáticamente cualquier cosa que pueda hacer localmente, incluyendo:

  • Crea una confirmación de fusión.

    No genera autor! = Committer.

    Mantiene el SHA o el nuevo commit intacto, y crea un nuevo commit:

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

    Históricamente, este fue el primer método disponible en GitHub.

    A nivel local, esto se hace con git merge --no-ff.

    Esto produce dos confirmaciones por solicitud de extracción y mantiene una bifurcación en el historial de git.

  • rebase encima de master

    GitHub también piratea las confirmaciones para establecer committer == quien presionó el botón de combinación. Esto no es obligatorio, y ni siquiera se hace de forma local por defecto git rebase, pero da responsabilidad al responsable del proyecto.

    El árbol git ahora se ve así:

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

    que es exactamente como el de los git applyparches de correo electrónico.

En GitHub actualmente:

  • elige el método al fusionar a través del menú desplegable en el botón de fusión
  • El propietario puede habilitar o deshabilitar los métodos en la configuración del repositorio

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

¿Cómo configurar el committer de un nuevo commit?

Lo mejor que pude encontrar fue usar las variables de entorno para anular el committer:

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

¿Cómo obtener el committer y la fecha de commit de un commit dado?

Solo los datos del autor se muestran por defecto en git log.

Para ver la fecha de confirmación puede:

  • formatee el registro específicamente para eso:

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

    dónde cny cdpararse Committer NameyCommitter Date

  • use el fullerformato predefinido:

    git log --format=fuller
    

    Consulte también: Cómo configurar 'git log' para mostrar 'commit date'

  • ir bajo nivel y mostrar todos los datos de confirmación:

    git cat-file -p HEAD
    

¿Cómo establecer la fecha de confirmación de una nueva confirmación?

git commit --date solo establece la fecha del autor: para la fecha de confirmación, lo mejor que pude encontrar fue con la variable de entorno:

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

Ver también: ¿Cuál es la diferencia entre autor y committer en Git?

¿Cómo almacena internamente Git autor vs committer?

Ver: ¿Cuál es el formato de archivo de un objeto git commit?

Básicamente, el commit es un archivo de texto y contiene dos campos separados por líneas:

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

Esto deja en claro que ambas son dos entradas de datos completamente independientes en el objeto de confirmación.


1
Tenga en cuenta que incluso con GIT_COMMITTER_*anulaciones, git se negará a realizar una confirmación si no ha configurado un confirmador predeterminado usando git config.
adelphus

1
@adelphus en Git 2.5, funciona si configura ambosGIT_{COMMITTER,AUTHOR}_EMAIL
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

3

@Ciro Santilli 新疆 改造 中心 六四 事件 法轮功propuso usar

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

Para evitar repetir el nombre y el correo electrónico, puede reutilizarlos

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

que primero establece las variables en comandos separados, luego las usa para la git commitllamada (tenga en cuenta los paréntesis dobles).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.