Pregunta

Quiero cambiar el autor de uno específico comprometerse en la historia. No es la última confirmación.

Yo sé sobre esta pregunta - ¿Cómo Cómo puedo cambiar el autor de una confirmación en git?

Pero estoy pensando en algo, cuando me identifico el commit de Hash o corto-hash.

¿Fue útil?

Solución

Interactivo rebase fuera de un punto anterior en la historia que el commit tiene que modificar (git rebase -i <earliercommit>). En la lista de confirmaciones se reajusta, cambiar el texto de pick a edit junto con el hash de la persona que desea modificar. Luego, cuando indicaciones git cambiar la confirmación, utilice la siguiente:

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

Por ejemplo, si su historia es comprometerse con A-B-C-D-E-F F como HEAD, y desea cambiar el autor de C y D, entonces lo haría ...

  1. Especificar git rebase -i B ( aquí es un ejemplo de lo que se verá después de ejecutar el comando git rebase -i B )
    • si necesita editar A, el uso git rebase -i --root
  2. cambiar las líneas, tanto para C y D de pick a edit
  3. Una vez iniciado el rebase, sería la primera pausa en C
  4. Usted haría git commit --amend --author="Author Name <email@address.com>"
  5. A continuación, git rebase --continue
  6. Sería una pausa de nuevo en D
  7. De allí tendría que git commit --amend --author="Author Name <email@address.com>" nuevo
  8. git rebase --continue
  9. El rebase completaría.
  10. Uso git push -f para actualizar su origen con las confirmaciones actualizados.

Otros consejos

El respuesta aceptada a esta pregunta es un uso inteligente de rebase maravillosamente interactiva, pero por desgracia exhibe conflictos si el commit estamos tratando de cambiar el autor de que solía ser en una rama, que posteriormente se fusionó en. en términos más generales, no hace el trabajo al manejar historias desordenadas.

Desde que estoy preocupado sobre la ejecución de secuencias de comandos que dependen de las variables de ajuste y el medio ambiente desarmado de reescribir la historia de Git, estoy escribiendo una nueva respuesta en base a este post que es similar a esta respuesta, pero es más completa.

La siguiente es probado y de trabajo, a diferencia de la respuesta vinculado. Supongamos por claridad de exposición que 03f482d6 es el commit cuyo autor que estamos tratando de reemplazar y 42627abe es el commit con el nuevo autor.

  1. Pedido cometer la que estamos tratando de modificar.

    git checkout 03f482d6
    
  2. Haga el cambio autor.

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

    Ahora tenemos un nuevo commit de almohadilla supone que 42627abe.

  3. Pedido la rama originales.

  4. reemplazar el viejo se comprometen con el nuevo local.

    git replace 03f482d6 42627abe
    
  5. Vuelve a escribir todos los envíos futuros basados ??en la sustitución.

    git filter-branch -- --all
    
  6. Eliminar el reemplazo para la limpieza.

    git replace -d 03f482d6
    
  7. Empuje la nueva historia (sólo utilizar --force si el siguiente no funciona, y sólo después de comprobar la cordura con git log y / o git diff).

    git push --force-with-lease
    

En lugar de 4-6 que sólo puede rebasar a nuevo commit:

git rebase -i 42627abe

un guión que sustituye a la información confirmador para todas las confirmaciones 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
  • Restablecer su correo electrónico a la configuración global:

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

  • Ahora restablecer el autor de su compromiso sin editar requerido:

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

Puede cambiar autor de la última confirmación con el comando a continuación.

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

Sin embargo, si desea cambiar más de uno comete el nombre del autor, es un poco complicado. Es necesario iniciar un rebase interactivo después comete marca como editar entonces enmendar uno por uno y acabado.

Inicio rebase con git rebase -i. Se le mostrará algo como esto.

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

Cambiar la palabra clave pick a edit para las confirmaciones que desea cambiar el nombre del autor.

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

A continuación, cierre el editor. Para los principiantes, a continuación, escriba golpe Escape :wq y Enter éxito.

A continuación podrá ver su terminal como si nada. En realidad, usted está en medio de un rebase interactivo. Ahora es el momento de enmendar su commit del nombre del autor usando el comando anterior. Se abrirá el editor de nuevo. Dejar de fumar y continuar con el rebase git rebase --continue. Repetir lo mismo para la cuenta de confirmación que desea editar. Puede asegurarse de que rebase interactivo terminó cuando recibe el mensaje No rebase in progress?.

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

Como excusa para probar git filter-branch, me escribió un guión para volver a escribir el nombre del autor y / o Autor de correo electrónico para un commit dado:

#!/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

Commit antes:

 introducir descripción de la imagen aquí

Para el autor solución para todas las confirmaciones puede aplicar comandos de @ respuesta de Amber:

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

O volver a utilizar su nombre y correo electrónico que usted puede escribir:

git commit --amend --author=Eugen

Commit después del comando:

 introducir descripción de la imagen aquí

Por ejemplo, para cambiar todo a partir de 4025621:

 introducir descripción de la imagen aquí

Debe ejecutar:

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

Nota: Para incluir un autor que contiene espacios, como un nombre y dirección de correo electrónico, el autor debe estar rodeado por comillas escapado. Por ejemplo:

git rebase --onto 4025621 --exec "git commit --amend --author=\"Foo Bar <foo@bar.com>\"" 4025621

o añadir este alias en ~/.gitconfig:

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

Y a continuación, ejecute:

git reauthor 4025621 Eugen

Hay un paso adicional al de ámbar respuesta si estás usando un repositorio centralizado:

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

Tenga cuidado de que no hay una gran cantidad de personas que trabajan en la misma rama, ya que puede arruinar la coherencia.

Al hacer git rebase -i hay esta parte interesante en el doc:

  

Si desea doblar dos o más confirmaciones en una sola, reemplazar el "pick" de comandos para la segunda y posteriores confirmaciones con "squash" o "fixup". Si las confirmaciones tenían diferentes autores, el plegado cometer será atribuido al autor de la primera comprometerse. El mensaje sugerido comprometerse para el plegado cometer es la concatenación de los mensajes de confirmación de la primera comprometerse y de los que tienen el comando "squash", pero omite los mensajes de subidas de las confirmaciones con el comando "fixup".

  • Si usted tiene una historia de A-B-C-D-E-F,,
  • y desea cambiar compromete B y D (= 2 commit),

A continuación, se puede hacer:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • crear compromete vacías (una para cada confirmación):
    • se necesita un mensaje para el propósito de rebase
    • git commit --allow-empty -m "empty"
  • iniciar la operación de rebase
    • git rebase -i B^
    • selecciona B^ los padres de B.
  • que se quiera poner una vacía cometer antes de cada obliga a modificar
  • querrá cambio pick a squash para aquellos.

Ejemplo de lo que le dará git rebase -i B^:

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

a cambio que:

# 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

Se le preguntará si desea editar 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 se puede simplemente eliminar las primeras líneas.

En apoyo a la respuesta Eugen Konkov , a partir de la raíz cometer, bandera --root uso. La bandera es útil también --no-edit

git rebase --root --exec "git commit --amend --author='name <email>' --no-edit"

Si lo que necesita cambiar es el autor de la última confirmación y ningún otro está usando su repositorio, puede deshacer el último comprometerse con:

git push -f origin last_commit_hash:branch_name 

cambiar el nombre del autor de su compromiso con:

git commit --amend --author "type new author here"

Salir del editor que se abre y empujar de nuevo su código:

git push

También hay un enfoque perezoso para este problema, especialmente si usted tiene más de un commit que desea cambiar. En mi caso, tuve una nueva rama con varias entregas con un autor equivocado, así que lo que me ayudó:

Ir a su sucursal original:

git checkout develop

Crear nueva rama de ella:

git checkout -b myFeature develop 

Combinar sin comprometer información como uno cometen:

git merge --no-commit --squash branchWrongAuthor

Es posible que también quieren cambios de etapa:

git stage .

Cambiar el nombre del autor y confirmar los cambios:

git commit --amend --author "New Author Name <New Author Email>" -m "new feature added"

Y eso es todo, puede empujar los cambios.

git push

Es posible eliminar la rama con un autor mal después de eso.

Si el envío que desea el cambio no es la última confirmación, a continuación, siga el siguiente pasos. Si su commit es diferente en rama y luego cambie primero a esa rama.

git checkout branch_name

buscar cometer antes de la confirmación de que desea cambiar y encontrar su hash. Luego de comandos cuestión de rebase.

git rebase -i -p de hash de cometer

A continuación, un editor se abrirá y entrar en 'editar' para las confirmaciones que desea cambiar. Dejar otros con defecto 'recoger' opción. Una vez cambiado introducir clave 'esc' y WQ! a la salida.

A continuación, emita git commit comando con la opción de enmienda.

git commit --amend --author = "Nombre de usuario de correo electrónico" --no-editar

A continuación, emita el siguiente comando.

git rebase --continue

Una vez que cometen autor se actualiza en el repositorio local, empujar los cambios al repositorio remoto.

Los pasos para cambiar el nombre el nombre del autor después de una entrega empujado

  1. Primer tipo "git log" para obtener el Commit Identificación y más detalles
  2. git rebase i CABEZA ~ 10 (10 es el total se comprometen a mostrar en rebase)

    If you Get anything like below

    fatal: It seems that there is already a rebase-merge directory, and I wonder if you are in the middle of another rebase. If that is the case, please try

    git rebase (--continue | --abort | --skip) If that is not the case, please rm -fr ".git/rebase-merge" and run me again. I am stopping in case you still have something valuable there.

  3. A continuación, escriba "git rebase --continue" o "git rebase --abort" según su necesidad

    • Ahora abre la ventana de su voluntad de rebase, haga clic en "i" llave del teclado
    • por lo que recibirá la lista de confirmaciones a 10 [porque hemos pasado por encima de 10 se comprometen] Como a continuación

    pick 897fe9e simplify code a little

    pick abb60f9 add new feature

    pick dc18f70 bugfix

  4. Ahora es necesario agregar a continuación de comandos justo por debajo de la confirmación tiene que desea editar, como a continuación

    pick 897fe9e simplify code a little exec git commit --amend --author 'Author Name <author.name@mail.com>' pick abb60f9 add new feature exec git commit --amend --author 'Author Name <author.name@mail.com>' pick dc18f70 bugfix exec git commit --amend --author 'Author Name <author.name@mail.com>'

    1. Eso es todo, ahora sólo tiene que pulsar ESC,: WQ y que está todo listo

    2. A continuación origen git push CABEZA: NOMBRE DE LA SUCURSAL -f [por favor asegúrese de -f Fuerza de empuje]

    como git push -f o git push origin HEAD: dev -f

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top