¿Cómo se compromete el código como un usuario diferente?

112

Quiero poder hacer esto para un guión. Básicamente, estoy recreando todo el historial de versiones de algún código en Git; actualmente usa un sistema de control de versiones diferente. Necesito que el script pueda agregar las confirmaciones a Git mientras se conserva el autor original (y la fecha) de la confirmación.

Suponiendo que conozco al autor de la confirmación y la fecha / hora en que se realizó el cambio, ¿hay un comando de Git que me permita hacer esto? Supongo que sí, porque git-p4 hace algo similar. Solo estoy preguntando cuál es la mejor manera de hacerlo.

Carl
fuente
1
¿Ha intentado utilizar la importación rápida?
alternativa
Estoy de acuerdo, es probable que la importación rápida sea ​​la mejor manera de hacerlo. Puede usar git commit (o más apropiadamente la plomería subyacente: hash-object , update-index , write-tree , commit-tree , update-ref , etc.), pero la importación rápida sería, bueno, más rápida.
Chris Johnsen
Pensé en la importación rápida, pero como soy bastante principiante en git, decidí usar los comandos básicos. Para ser completamente honesto, no entiendo completamente cómo funciona la importación rápida y, por lo tanto, dudo un poco en usarlo hasta que lo entienda mejor. Sí, será mucho más lento usar commit, pero al menos sabré qué esperar, especialmente durante la depuración.
Carl
1
git commit --author = "Name <[email protected]>" -a -m "commit msg"
Masih

Respuestas:

148

Consulte la --authoropción para git commit:

Desde la página del manual :

--author=<author>

Anula el autor de la confirmación. Especifique un autor explícito utilizando el A U Thor <[email protected]>formato estándar . De <author>lo contrario, se asume que es un patrón y se usa para buscar una confirmación existente por ese autor (es decir rev-list --all -i --author=<author>); el autor de la confirmación se copia de la primera confirmación de este tipo encontrada.

Tim Henigan
fuente
18
Además, la --dateopción de anular la fecha.
Chris Johnsen
¿Puede dar un ejemplo específico, todo lo que intento?
studgeek
@Tim Henigan: Parece que la documentación ahora está alojada en Github, por lo que el enlace de la página de manual que publicó está muerto. ¿Puede confirmar que la nueva página es la misma (en caso de que haya otras respuestas que necesiten actualizar los enlaces)?
R0MANARMY
@ R0MANARMY: Actualicé la URL. Las páginas de GitHub son correctas. Actualicé mi enlace porque las páginas de manual ya no están alojadas en kernel.org. Gracias por informarme sobre el cambio.
Tim Henigan
1
Esto es lo que terminé usando:git commit -a --author="$user_details" --date="submit_date $submit_time" --file=/tmp/commit_msg
Carl
113

Sólo para añadir a esto: La --authoropción mencionada en la respuesta aceptada sólo anulará el autor , no el confirmador información de la confirmación.

Ese es el comportamiento correcto en la mayoría de los casos, pero si por alguna razón también necesita anular manualmente la información del confirmador , use las variables de entorno GIT_COMMITTER_NAMEy GIT_COMMITTER_EMAIL(también hay una GIT_COMMITTER_DATE). Ver Git-Internals-Environment-Variables

$ GIT_COMMITTER_NAME="New Name" GIT_COMMITTER_EMAIL="[email protected]" git commit --author="New Name <[email protected]>"

Esto hará que la confirmación parezca que fue creada y confirmada por el usuario especificado.

friederbluemle
fuente
16
... y para ver la diferencia:git log --pretty=fuller
bluenote10
2
Perfecto. Esto es lo que quería y nunca podría haber encontrado la página de manual de git internals.
ksp
3

Edite su archivo ~ / .gitconfig y agregue un nuevo alias donde pueda personalizar un usuario y correo electrónico no predeterminados.

[user]
  name = My Name
  email = [email protected]

[alias]
  commit-x = -c user.name='My X Name' -c user.email='[email protected]' commit
  commit-y = -c user.name='My Y Name' -c user.email='[email protected]' commit
  commit-z = -c user.name='My Z Name' -c user.email='[email protected]' commit

Pruébalo

git commit -m "Custom message with committer and author My Name <[email protected]>"
git commit-x -m "Custom message with committer and author My X Name <[email protected]>"
git commit-y -m "Custom message with committer and author My Y Name <[email protected]>"
git commit-z -m "Custom message with committer and author My Z Name <[email protected]>"
BeardOverflow
fuente