¿Diferencia entre autor y committer en Git?


Estoy tratando de hacer un commit como

git commit --author="John Doe <[email protected]>" -m "<the usual commit message>"

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

Aparece bien en git log. Sin embargo, cuando hago un gitk, el nombre del autor es correcto, pero el nombre del committer se elige de mi configuración global 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 estar estableciendo el committer también al otro usuario?

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

Author: mu 無, 2013-09-12

2 answers

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. El autor, por otro lado, se supone que es la persona que cometió el código en nombre del autor original. Esto es importante en Git porque Git te permite reescribir el historial o aplicar parches en nombre de otra persona. Las FREE online Pro Git book lo explica así esto:

Te estarás preguntando cuál es la diferencia entre author y committer. El autor es la persona que originalmente escribió el parche, mientras que el committer es la 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 obtienen crédito: usted como autor y el miembro principal como committer.

El póster original pregunta:

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

No, si quieres ser honesto, no deberías asignar el committer al autor, a menos que el autor y el committer sean realmente la misma persona.

 157
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-13 00:53:01

Lista de Correo + git format-patch + git apply puede generar autor != committer

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

Generando un solo commit nuevo con diferente autor y committer:

  • el autor es quien escribió el parche
  • el committer es quien es un mantenedor del proyecto, y quien fusionó el parche

Vea por ejemplo este parche seleccionado aleatoriamente 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 tanto los repositorios upstream como los fork en la misma máquina, pueden hacer automáticamente cualquier cosa que puedas hacer localmente también, incluyendo cualquiera de los siguientes:{[28]]}

  • Crea una confirmación de fusión.

    No genera autor != committer.

    Mantiene intacto el SHA o el nuevo commit, 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.

    Localmente, esto se hace con git merge --no-ff.

    Esto produce dos commits por pull request, y mantiene un fork en el historial de git.

  • Rebase encima de master

    GitHub también hackea las confirmaciones para establecer committer == quien haya pulsado el botón merge. Esto no es obligatorio, y ni siquiera se hace localmente por defecto por git rebase, pero da responsabilidad al mantenedor del proyecto.

    El árbol de git ahora se ve como:

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

    Que es exactamente como el de los parches de correo electrónico git apply.

En GitHub actualmente:

  • usted elige el método al fusionar a través del menú desplegable en el botón fusionar
  • los métodos se pueden habilitar o deshabilitar en la configuración del repositorio por el propietario

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

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

Lo mejor que pude encontrar fue usar el entorno variables 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 del committer puedes:

  • Formatee el registro específicamente para eso:

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

    Donde cn y cd stand para Committer Name y Committer Date

  • Utilice el formato predefinido fuller:

    git log --format=fuller
    

    Véase también: Cómo configurar ' git log' para mostrar 'fecha de confirmación'

  • Vaya a un nivel bajo y muestre los datos completos de la 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 del committer 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 Git autor vs committer internamente?

Ver: ¿Cuál es el formato de archivo de un objeto de confirmación de git?

Básicamente, la confirmación 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 claro que ambas son dos entradas de datos completamente independientes en el objeto commit.

 65
Author: Ciro Santilli 新疆改造中心 六四事件 法轮功,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-30 16:17:36