Cómo cambiar el autor de confirmar para una específica comprometerse?
-
27-09-2019 - |
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.
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 ...
- Especificar
git rebase -i B
( aquí es un ejemplo de lo que se verá después de ejecutar el comandogit rebase -i B
)- si necesita editar
A
, el usogit rebase -i --root
- si necesita editar
- cambiar las líneas, tanto para
C
yD
depick
aedit
- Una vez iniciado el rebase, sería la primera pausa en
C
- Usted haría
git commit --amend --author="Author Name <email@address.com>"
- A continuación,
git rebase --continue
- Sería una pausa de nuevo en
D
- De allí tendría que
git commit --amend --author="Author Name <email@address.com>"
nuevo -
git rebase --continue
- El rebase completaría.
- 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.
-
Pedido cometer la que estamos tratando de modificar.
git checkout 03f482d6
-
Haga el cambio autor.
git commit --amend --author "New Author Name <New Author Email>"
Ahora tenemos un nuevo commit de almohadilla supone que
42627abe
. -
Pedido la rama originales.
-
reemplazar el viejo se comprometen con el nuevo local.
git replace 03f482d6 42627abe
-
Vuelve a escribir todos los envíos futuros basados ??en la sustitución.
git filter-branch -- --all
-
Eliminar el reemplazo para la limpieza.
git replace -d 03f482d6
-
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 / ogit 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.
Cambiar la palabra clave pick
a edit
para las confirmaciones que desea cambiar el nombre del autor.
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:
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:
Por ejemplo, para cambiar todo a partir de 4025621
:
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
yD
(= 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 deB
.
-
- que se quiera poner una vacía cometer antes de cada obliga a modificar
- querrá cambio
pick
asquash
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
- Primer tipo "git log" para obtener el Commit Identificación y más detalles
-
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.
-
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
-
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>'
-
Eso es todo, ahora sólo tiene que pulsar ESC,: WQ y que está todo listo
-
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
ogit push origin HEAD: dev -f
-