¿Diferencia entre autor y confirmador en Git?
Estoy tratando de hacer un compromiso como
git commit --author="John Doe <[email protected]>" -m "<the usual commit message>"
donde John Doe es un usuario en cuyo nombre quiero realizar la confirmación.
Aparece bien en git log
. Sin embargo, cuando hago un gitk
, el nombre del autor es correcto, pero el nombre del confirmador se elige de mi configuración global de git (y, por lo tanto, se establece en mi nombre/correo electrónico).
Preguntas
¿Cuál es la diferencia entre los dos (committor vs autor)?
¿Debería configurar el confirmador también para el otro usuario?
Si es así, ¿cómo?
El cartel original pregunta:
¿Cuál es la diferencia entre los dos (committor vs autor)?
El autor es la persona que escribió originalmente el código. Por otro lado, se supone que el autor de la confirmación es la persona que confirmó 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. El libro GRATUITO en línea de Pro Git lo explica así:
Quizás se pregunte cuál es la diferencia entre autor y confirmador . El autor es la persona que escribió originalmente el parche, mientras que el autor es la persona que aplicó el parche por última vez. Entonces, 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 responsable.
El cartel original pregunta:
¿Debería configurar el confirmador también para el otro usuario?
No, si quiere ser honesto, no debería asignar el confirmador al autor, a menos que el autor y el confirmador sean de hecho la misma persona.
Lista de correo + git format-patch
+ git apply
puede generar autor! = confirmador
En proyectos como el kernel de Linux donde los parches son:
- generado por
git format-patch
- enviado por correo electrónico, ya sea copiando y pegando, o más comúnmente con
git send-email
- aplicado por otra persona con
git apply
ogit am
: ¿ Cómo usar git am para aplicar parches de mensajes de correo electrónico?
generando una nueva confirmación única con diferente autor y confirmador:
- el autor es quien escribió el parche
- el confirmador es quién es el mantenedor del proyecto y quién fusionó el parche
Vea, por ejemplo, este parche seleccionado aleatoriamente y la confirmación correspondiente:
- https://lkml.org/lkml/2018/1/25/568
- https://github.com/torvalds/linux/commit/5beda7d54eafece4c974cfa9fbb9f60fb18fd20a
Las interfaces web de Git como GitHub y GitLab pueden o no generar autor! = confirmador
Dado que Git(Hub|Lab) contiene los repositorios upstream y fork en la misma máquina, pueden hacer automáticamente cualquier cosa que usted pueda hacer localmente también, incluido cualquiera de:
Crea una confirmación de fusión.
¡No genera autor! = confirmador.
Mantiene intacto el SHA o la nueva confirmación y crea una nueva confirmación:
* 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 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 el confirmador == quien haya presionado el botón de combinación. Esto no es obligatorio, y ni siquiera lo hace localmente de forma predeterminada
git rebase
, pero le da responsabilidad al mantenedor del proyecto.El árbol de git ahora luce así:
* Feature commit (committer == maintainer, author == contributor) | * Old master (random committer and author)
que es exactamente igual al de los
git apply
parches de correo electrónico.
En GitHub actualmente:
- usted elige el método al fusionar a través del menú desplegable en el botón de fusionar
- 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 confirmador de un nuevo compromiso?
Lo mejor que pude encontrar fue usar las variables de entorno para anular el confirmador:
GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a <a>'
¿Cómo obtener el confirmador y la fecha de confirmación de una confirmación determinada?
Sólo los datos del autor se muestran de forma predeterminada en git log
.
Para ver la fecha del confirmador, puede:
formatee el registro específicamente para eso:
git log --pretty='%cn %cd' -n1 HEAD
donde
cn
ycd
representanCommitter Name
yCommitter Date
Utilice el
fuller
formato predefinido:git log --format=fuller
Ver también: Cómo configurar 'git log' para mostrar la 'fecha de confirmación'
vaya a un nivel bajo y muestre todos los datos de confirmación:
git cat-file -p HEAD
¿Cómo establecer la fecha del confirmador de un nuevo compromiso?
git commit --date
solo establece la fecha del autor: para la fecha del confirmador, 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 confirmador en Git?
¿Cómo almacena Git el autor frente al confirmador 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 de confirmación.