¿Cómo cambio correctamente el autor de una confirmación para las últimas confirmaciones en github?

8 minutos de lectura

avatar de usuario
abejafriedman

Durante los últimos días usé una computadora portátil diferente, configuré git e inicié sesión, pero accidentalmente usé mi nombre de usuario con un correo electrónico incorrecto.

Hoy me di cuenta de que mis confirmaciones de los últimos días no aparecían en el panel de control de mi perfil de github, así que verifiqué lo que estaba pasando y noté que usé el correo electrónico incorrecto para iniciar sesión.

Intenté algunas formas diferentes de solucionarlo, pero ninguna de ellas funcionó.

1.

git rebase -i -p <The last commit with the good email>

Luego, para cada compromiso.

git commit --amend --author="good name <good email>" --no-edit
git rebase --continue

En lugar de simplemente cambiar el autor de las confirmaciones, hizo nuevas confirmaciones con mi buen correo electrónico pero no cambió las antiguas.

2.

git filter-branch --env-filter 'if [ "$GIT_AUTHOR_EMAIL" = "incorrect@email" ]; then
     GIT_AUTHOR_EMAIL=correct@email;
     GIT_AUTHOR_NAME="Correct Name";
     GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL;
     GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; fi' -- --all

como se ve aquí, pero no hizo nada…

3.
En una de las respuestas, alguien mencionó que debería usar el mismo comando que usé.

git rebase -i -p <The last commit with the good email>

pero sin la “-p”. Lo probé, pero también hizo nuevos compromisos y no mantuvo los compromisos anteriores con las fechas anteriores.


Entonces, necesito ayuda para obtener todas las confirmaciones nuevas de mi historial y arreglar las antiguas para tener un buen correo electrónico.

  • Esta pregunta ha sido mencionada en meta.

    – yivi

    15 de julio de 2021 a las 7:16

  • De acuerdo, no nos dio ningún mensaje de error que esté recibiendo, pero: asegúrese de no eliminar sus nuevas confirmaciones 🙂 Como ya se publicó en esa respuesta que ya mencionó y también a continuación, si ha arreglado todo localmente, tienes que traerlo al servidor de la manera correcta y eso sería haciéndolo con el forced indicador: “git push –force”

    – Janos Vincentler

    18 de julio de 2021 a las 17:43

  • @JanosVinceller No recibí ningún error. Simplemente no cambió al autor en absoluto.

    – Bee Friedman

    18 de julio de 2021 a las 20:15

  • @BeeFriedman OK: sería git filter-repo ¿trabaja mejor?

    – VoC

    18 de julio de 2021 a las 20:17

  • NO PUEDES CAMBIAR LAS COMISIONES. Puede hacer etiquetas nuevas y volver a colgarlas para que se refieran a ellas en lugar de a las originales, pero NO PUEDES CAMBIAR LAS COMISIONES.

    – jthill

    20 de julio de 2021 a las 19:42

¡Gracias a todos los que ayudaron! Terminé obteniendo muchos enfoques diferentes, pero no funcionó para mí, terminé teniendo que reorganizar mi repositorio varias veces al estado anterior a los cambios porque las cosas se estropearon.
Al final me puse en contacto con el soporte de Github y esto es lo que me dijeron que hiciera, y funcionó. Lo publico aquí con la esperanza de que ayude a alguien que tenga un problema similar.

PD Esto es bastante similar a esta respuesta sugerida aquí, pero esa respuesta no funcionó cuando la probé. Este tiene algunos cambios menores (clonar una copia simple y realizar el cambio allí) y funcionó.


1 – Antes de ejecutar este script, necesitará:

La dirección de correo electrónico anterior que aparece en los campos de autor/autor que desea cambiar El nombre y la dirección de correo electrónico correctos a los que desea que se atribuyan dichas confirmaciones 2: cree un clon nuevo y simple de su repositorio:

  git clone --bare <external repo URL>.git
  cd <reponame>.git

3 – Copie y pegue el script, reemplazando las siguientes variables según la información que recopiló:

OLD_EMAIL
CORRECT_NAME
CORRECT_EMAIL
  #!/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

4 – Presione Enter para ejecutar el script.

5 – Revise el nuevo historial de Git en busca de errores.

6 – Empuje el historial corregido a:

  git push --mirror <GitHub repo URL>.git

7 – Limpiar el clon temporal:

  cd ..
  rm -rf <reponame>.git

avatar de usuario
VonC

Pruebe primero y clone el repositorio en un separar carpeta local, para probar el siguiente comando.

Necesitas instalar newren/git-filtro-repo para volver a escribir el autor de su cuenta anterior a su cuenta nueva.

Consulte “¿Cómo cambiar el autor de la confirmación para múltiples confirmaciones usando la rama de filtro?” y
git filter-repo / Filtrado basado en usuarios y correos electrónicos

git filter-repo --mailmap my-mailmap

con my-mailmap:

Correct Name <correct@email.com> <old@email.com>

Eso reescribirá sus compromisos con el autor correcto.

Entonces necesitarás git push --force (suponiendo que uno main branch) para anular el historial remoto con sus nuevas confirmaciones. Si no está solo trabajando en el repositorio remoto, asegúrese de hacérselo saber a sus colaboradores.

  • en su respuesta, sugiere utilizar una herramienta de terceros. ¿No hay forma de hacerlo usando solo git?

    – Bee Friedman

    19 de julio de 2021 a las 2:50

  • @BeeFriedman No de manera confiable, por razones detalladas en github.com/newren/…. Darle una oportunidad. funciona muy bien

    – VoC

    19 de julio de 2021 a las 5:52

  • Lea la última línea del primer párrafo en el enlace de VonC 😉

    – Íñigo

    19 de julio de 2021 a las 7:07

  • @VonC, intenté usar esta herramienta y tengo algunos problemas. La única forma en que podría ejecutarlo es como un script de python, “git filter-repo.py” y cuando agrego las banderas y lo ejecuto, no sucede nada. ¿Podría explicar con más detalle cómo usarlo en Windows? ¡Gracias!

    – Bee Friedman

    20 de julio de 2021 a las 15:34


  • @BeeFriedman Lo probé en Windows (en un simple CMD) sin problema: git filter-repo (no .py extensión) es suficiente, siempre que python y el script (es decir, un clon de github.com/newren/git-filtro-repo) están en su %PATH%.

    – VoC

    20 de julio de 2021 a las 15:55


avatar de usuario
Anubhav Gupta

Estabas muy cerca del método correcto. simplemente no agregues -p mientras se rebase.

De acuerdo con la documentación de git,
https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt—preserve-merges

-p opción: volver a crear confirmaciones de combinación en lugar de aplanar el historial reproduciendo confirmaciones que introduce una confirmación de combinación.

Hice los mismos pasos que mencionaste en tu pregunta, sin -p, y funcionó perfectamente. Aquí está la lista de pasos en caso de que lo necesite.


En primer lugar, clone el repositorio localmente y realice una reorganización interactiva para todas las confirmaciones.

git rebase --interactive COMMIT~

Por ejemplo :-

git rebase --interactive 8020fc5fe36d75b066f7c06a29c92a29ccf6e2b4~

donde 8020fc5fe36d75b066f7c06a29c92a29ccf6e2b4 es la confirmación más antigua a partir de la cual desea comenzar a corregir.

Puede obtener este valor de git log

despues de correr git rebasedispondrás de un editor de texto, con opciones para pick/edit/… para cada compromiso.

Tomemos un ejemplo, donde obtienes algo como esto…

pick 8020fc5 1
pick e99c3c7 2
pick 7c4f81e 3
pick 3b30037 4
pick 98d901b 5
pick 8ded5a1 6
pick 5a61adc 7
pick 8fe082c 8
pick 1abebc1 9

Para todas las confirmaciones para las que desea cambiar el autor, cambie el comando a edit desde pick

Como en el siguiente ejemplo, quiero cambiar los autores de 3 y 5entonces

pick 8020fc5 1
pick e99c3c7 2
edit 7c4f81e 3 #changed here
pick 3b30037 4
edit 98d901b 5 #changed here
pick 8ded5a1 6
pick 5a61adc 7
pick 8fe082c 8
pick 1abebc1 9

Ahora guarde el archivo y salga.

Luego, estará en el momento justo antes de aplicar el primer compromiso que ha establecido para edit.

Sin cambiar nada, haz los siguientes pasos..

git commit --amend --author="NAME <EMAIL>" --no-edit
git rebase --continue

Después de esto, el repositorio estará en el punto justo antes de aplicar la segunda confirmación que seleccionó para editasí que repítelo hasta que termines

Actualizar:

git rebase --committer-date-is-author-date HASH donde HASH es la primera confirmación con la marca de tiempo correcta.

Entonces hazlo git log --format=fuller para ver si las marcas de tiempo de confirmación son las que desea.

  • Seguí tu respuesta y comprometí todo con la fecha de hoy. Quiero que tengan las fechas originales. ¿Cómo podría deshacer esto y arreglarlo?

    – Bee Friedman

    20 de julio de 2021 a las 15:32

  • Lo siento, tuve la idea equivocada de que github mostraba la fecha del autor y no la fecha del autor de la confirmación. Se puede arreglar fácilmente, y he actualizado mi respuesta. Esperemos que solucione su problema. Sin embargo, ¿podría hacer git log y confirmar si las marcas de tiempo que está viendo en git log son las que desea ver en github? Si ese es el caso, siga la respuesta actualizada.

    – Anubhav Gupta

    21 de julio de 2021 a las 0:59

  • Sí, en el registro tienen las fechas correctas. Probaré tu respuesta actualizada. ¡Gracias!

    – Bee Friedman

    21 de julio de 2021 a las 1:01

  • espera, todavía lo estoy actualizando.

    – Anubhav Gupta

    21 de julio de 2021 a las 1:02

  • Terminé de agregar lo que tenía que agregar, git rebase --committer-date-is-author-date HASH donde HASH es la primera confirmación con la marca de tiempo correcta.

    – Anubhav Gupta

    21 de julio de 2021 a las 1:07

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad