Corregir Autores Retroactivamente con Git SVN?


Tengo un repositorio que ya he clonado desde SVN. He estado haciendo algún trabajo en este repositorio en su forma Git y odiaría perder esa estructura por clonar de nuevo. Sin embargo, cuando originalmente cloné el repositorio, fallé al especificar correctamente la propiedad svn.authors (o una opción semánticamente similar). ¿Hay alguna forma de que pueda especificar las asignaciones de autor de SVN ahora que el repositorio está completamente Git-iado? Preferiblemente, me gustaría corregir todo el antiguo commit autores para representar al autor de Git en lugar del nombre de usuario SVN sin procesar.

Author: Daniel Spiewak, 2008-12-25

3 answers

Comienza viendo lo que tienes que limpiar:

git shortlog -s

Para cada uno de esos nombres, cree una entrada en un script que tenga este aspecto (suponiendo que quiera que todos los autores y committers sean los mismos):

#!/bin/sh

git filter-branch --env-filter '

n=$GIT_AUTHOR_NAME
m=$GIT_AUTHOR_EMAIL

case ${GIT_AUTHOR_NAME} in
        user1) n="User One" ; m="[email protected]" ;;
        "User Two") n="User Two" ; m="[email protected]" ;;
esac

export GIT_AUTHOR_NAME="$n"
export GIT_AUTHOR_EMAIL="$m"
export GIT_COMMITTER_NAME="$n"
export GIT_COMMITTER_EMAIL="$m"
'

Ese es básicamente el script que usé para una reescritura grande recientemente que fue muy similar a lo que describiste (excepto que tuve un gran número de autores).

Edit Use π señaló un problema de comillas en mi script. ¡Gracias!

 56
Author: Dustin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-19 19:08:02

git filter-branch se puede utilizar para reescribir grandes trozos de historia.

En este caso, probablemente harías algo como (totalmente no probado):

git filter-branch --env-filter '
    GIT_AUTHOR_NAME=`echo "${GIT_AUTHOR_NAME}" | sed -e "s/svnname1/Right Name/; s/svnname2/Correct Name/"`
    GIT_COMMITTER_NAME=`echo "${GIT_COMMITTER_NAME}" | sed -e "s/svnname1/Right Name/; s/svnname2/Correct Name/"`
    GIT_AUTHOR_EMAIL=`echo "${GIT_AUTHOR_EMAIL}" | sed -e "s/svnname1/[email protected]/; s/svnname2/[email protected]/"`
    GIT_COMMITTER_EMAIL=`echo "${GIT_COMMITTER_EMAIL}" | sed -e "s/svnname1/[email protected]/; s/svnname2/[email protected]/"`
'

Como siempre, se aplica lo siguiente: para reescribir la historia, se necesita una conspiración.

 11
Author: Jörg W Mittag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-06 01:24:56

Probablemente quieras investigar git-filter-branch, específicamente la opción --commit-filter. Este comando es una poderosa motosierra que puede reescribir todo el historial de su repositorio, cambiando lo que quiera cambiar.

Tenga en cuenta que cuando haga esto, debe extraer nuevos clones del repositorio actualizado, ya que los hashes SHA1 de cada confirmación pueden haber cambiado.

 3
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-24 23:36:52