Pregunta ¿Cómo cambiar el autor de la confirmación para una confirmación específica?


Quiero cambiar el autor de un compromiso específico en la historia. No es el último compromiso.

Sé sobre esta pregunta - ¿Cómo cambio el autor de una confirmación en git?

Pero estoy pensando en algo, donde identifico el compromiso por hash o short-hash.


1380
2018-06-15 04:00


origen


Respuestas:


Rebase interactivo de un punto anterior del historial que el compromiso que necesita modificar (git rebase -i <earliercommit>) En la lista de confirmaciones que se vuelven a configurar, cambie el texto de pick a edit al lado del hash del que quieres modificar. Luego, cuando git te pida que cambies la confirmación, usa esto:

git commit --amend --author="Author Name <email@address.com>"

Por ejemplo, si su historial de compromisos es A-B-C-D-E-F con F como HEADy quieres cambiar el autor de C y D, entonces lo harías ...

  1. Especificar git rebase -i B (aquí hay un ejemplo de lo que verá después de ejecutar el git rebase -i B mando)
    • si necesitas editar A, utilizar git rebase -i --root
  2. cambia las líneas para ambos C y D de pick a edit
  3. Una vez que comenzó la rebase, primero se detendría en C
  4. Lo harías git commit --amend --author="Author Name <email@address.com>"
  5. Entonces git rebase --continue
  6. Se pausaría nuevamente en D
  7. Entonces lo harías git commit --amend --author="Author Name <email@address.com>" de nuevo
  8. git rebase --continue
  9. La rebase se completará.

2315
2018-06-15 04:31



los respuesta aceptada a esta pregunta es un uso maravillosamente inteligente de la rebase interactiva, pero desafortunadamente exhibe conflictos si el compromiso que estamos tratando de cambiar el autor de solía estar en una rama que luego se fusionó. En general, no funciona cuando se maneja sucio historias

Como estoy preocupado por ejecutar scripts que dependen de la configuración y desarmado de variables de entorno para reescribir el historial de git, estoy escribiendo una nueva respuesta basada en esta publicación que es similar a esta respuesta pero es más completo.

Lo siguiente está probado y funciona, a diferencia de la respuesta vinculada. Asuma para la claridad de la exposición que 03f482d6 es el compromiso cuyo autor estamos tratando de reemplazar, y 42627abe es el compromiso con el nuevo autor.

  1. Verifica el compromiso que estamos tratando de modificar.

    git checkout 03f482d6
    
  2. Haz que el autor cambie

    git commit --amend --author "New Author Name <New Author Email>"
    

    Ahora tenemos una nueva confirmación con el hash asumido como 42627abe.

  3. Verifica la sucursal original.

  4. Reemplace el compromiso anterior con el nuevo localmente.

    git replace 03f482d6 42627abe
    
  5. Reescribe todos los commit futuros basados ​​en el reemplazo.

    git filter-branch -- --all
    
  6. Elimine el reemplazo por limpieza.

    git replace -d 03f482d6
    
  7. Empuje el nuevo historial (solo use --force si falla lo siguiente, y solo después de la comprobación de cordura con git log y / o git diff)

    git push --force-with-lease
    

En lugar de 4-6, puedes volver a establecer la base de la nueva confirmación:

git rebase -i 42627abe

311
2018-03-04 02:11



La documentación de Github contiene un script que reemplaza la información del committer para todos los commits en una rama.

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"

if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

128
2018-06-09 16:02



Puede cambiar el autor de la última confirmación utilizando el siguiente comando.

git commit --amend --author="Author Name <email@address.com>"

Sin embargo, si quiere cambiar más de uno, el nombre del autor es un poco complicado. Debe iniciar una base de datos interactiva, luego marcar confirmaciones como editar, luego modificarlas una a una y finalizarlas.

Comience a rebasar con git rebase -i. Te mostrará algo como esto.

https://monosnap.com/file/G7sdn66k7JWpT91uiOUAQWMhPrMQVT.png

Cambiar el pick palabra clave a edit para los commits, quiere cambiar el nombre del autor.

https://monosnap.com/file/dsq0AfopQMVskBNknz6GZZwlWGVwWU.png

Luego cierre el editor. Para los principiantes, golpear Escape luego escribe :wq y golpear Enter.

Entonces verás tu terminal como si nada hubiera pasado. En realidad, estás en el medio de una base de datos interactiva. Ahora es el momento de modificar el nombre del autor de su compromiso utilizando el comando anterior. Se abrirá el editor de nuevo. Salir y continuar la rebase con git rebase --continue. Repita lo mismo para el recuento de confirmaciones que desea editar. Puede asegurarse de que la rebase interactiva finalice cuando obtenga el No rebase in progress? mensaje.


60
2017-08-29 00:52



  • Restablezca su correo electrónico a la configuración globalmente:

    git config --global user.email example@email.com

  • Ahora restablece el autor de tu confirmación sin necesidad de editar:

    git commit --amend --reset-author --no-edit


52
2018-04-05 12:44



Las respuestas en la pregunta a la que se vinculó son buenas respuestas y cubren su situación (la otra pregunta es más general ya que implica reescribir múltiples confirmaciones).

Como una excusa para probar git filter-branch, Escribí una secuencia de comandos para volver a escribir el nombre del autor y / o el correo electrónico del autor para una confirmación determinada:

#!/bin/sh

#
# Change the author name and/or email of a single commit.
#
# change-author [-f] commit-to-change [branch-to-rewrite [new-name [new-email]]]
#
#     If -f is supplied it is passed to "git filter-branch".
#
#     If <branch-to-rewrite> is not provided or is empty HEAD will be used.
#     Use "--all" or a space separated list (e.g. "master next") to rewrite
#     multiple branches.
#
#     If <new-name> (or <new-email>) is not provided or is empty, the normal
#     user.name (user.email) Git configuration value will be used.
#

force=''
if test "x$1" = "x-f"; then
    force='-f'
    shift
fi

die() {
    printf '%s\n' "$@"
    exit 128
}
targ="$(git rev-parse --verify "$1" 2>/dev/null)" || die "$1 is not a commit"
br="${2:-HEAD}"

TARG_COMMIT="$targ"
TARG_NAME="${3-}"
TARG_EMAIL="${4-}"
export TARG_COMMIT TARG_NAME TARG_EMAIL

filt='

    if test "$GIT_COMMIT" = "$TARG_COMMIT"; then
        if test -n "$TARG_EMAIL"; then
            GIT_AUTHOR_EMAIL="$TARG_EMAIL"
            export GIT_AUTHOR_EMAIL
        else
            unset GIT_AUTHOR_EMAIL
        fi
        if test -n "$TARG_NAME"; then
            GIT_AUTHOR_NAME="$TARG_NAME"
            export GIT_AUTHOR_NAME
        else
            unset GIT_AUTHOR_NAME
        fi
    fi

'

git filter-branch $force --env-filter "$filt" -- $br

46
2018-06-15 05:24



Cuando haces git rebase -i hay esta parte interesante en el documento:

Si quiere doblar dos o más commits en uno, reemplace el comando "pick" para el segundo y posteriores compromisos con "squash" o "fixup". Si las confirmaciones tienen autores diferentes, la confirmación plegada se atribuirá al autor de la primera confirmación. El mensaje de confirmación sugerido para el compromiso plegado es la concatenación de los mensajes de confirmación del primer compromiso y de aquellos con el "squash" comando, pero omite los mensajes de compromiso de compromisos con el "fixup" mando.

  • Si tienes un historial de A-B-C-D-E-F,
  • y quieres cambiar confirmaciones B y D (= 2 confirmaciones),

entonces puedes hacer:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • crear commits vacíos (uno para cada commit):
    • necesitas un mensaje para un propósito rebase
    • git commit --allow-empty -m "empty"
  • iniciar la operación de rebase
    • git rebase -i B^
    • B^ selecciona el padre de B.
  • querrás poner un commit vacío antes de cada uno se compromete a modificar
  • querrás cambiar pick a squash para esos.

Ejemplo de qué git rebase -i B^ Te regalaré:

pick sha-commit-B some message
pick sha-commit-C some message
pick sha-commit-D some message
pick sha-commit-E some message
pick sha-commit-F some message
# pick sha-commit-empty1 empty
# pick sha-commit-empty2 empty

cambiar eso a:

# change commit B's author
pick sha-commit-empty1 empty
squash sha-commit-B some message
# leave commit C alone
pick sha-commit-C some message
# change commit D's author
pick sha-commit-empty2 empty
squash sha-commit-D some message
# leave commit E-F alone
pick sha-commit-E some message
pick sha-commit-F some message

Le pedirá que edite los mensajes:

# This is a combination of 2 commits.
# The first commit's message is:

empty

# This is the 2nd commit message:

...some useful commit message there...

y puedes eliminar las primeras líneas.


12
2017-08-28 01:03



Hay un paso adicional para La respuesta de Amber si está utilizando un repositorio centralizado:

git push -f forzar la actualización del repositorio central.

Tenga cuidado de que no haya mucha gente trabajando en la misma sucursal porque puede arruinar la coherencia.


11
2017-12-20 15:06



Comprometerse antes:

enter image description here

Para corregir el autor de todas las confirmaciones, puede aplicar el comando desde la respuesta de @Amber:

git commit --amend --author="Author Name <email@address.com>"

O para reutilizar su nombre y correo electrónico puede simplemente escribir:

git commit --amend --author=Eugen

Commit después del comando:

enter image description here

Por ejemplo, para cambiar todo a partir de 4025621:

enter image description here

Debes correr:

git rebase --onto 4025621 --exec "git commit --amend --author=Eugen" 4025621

o agrega este alias a ~/.gitconfig:

[alias]
    reauthor = !bash -c 'git rebase --onto $1 --exec \"git commit --amend --author=$2\" $1' --

Y luego ejecuta:

git reauthor 4025621 Eugen

1
2018-06-30 12:16