2008-12-24 6 views
51

Tengo un repositorio que tengo ya clonado desde SVN. He estado trabajando en este repositorio en su forma Git y odiaría perder esa estructura clonando de nuevo. Sin embargo, cuando originalmente cloné el repositorio, no pude especificar correctamente la propiedad svn.authors (o una opción similar semánticamente). ¿Hay alguna forma de que pueda especificar las asignaciones de autor SVN ahora que el repositorio está completamente modificado? Preferiblemente, me gustaría corregir a todos los autores de confirmaciones anteriores para que representen al autor de Git en lugar del nombre de usuario de SVN sin formato.Autores retroactivamente correctos con Git SVN?

Respuesta

55

empezar por ver lo que se tiene que limpiar:

git shortlog -s 

Para cada uno de esos nombres, crear una entrada en un guión que se parece a esto (suponiendo que desea que todos los autores y committers a ser lo mismo):

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

eso es básicamente la escritura que utilicé para un large rewrite recientemente que era muy parecido a como se ha descrito (excepto que tenía un gran número de autores).

Editar Utilice π señaló un problema de cotización en mi script. ¡Gracias!

+1

Debe exportarse GIT_AUTHOR_NAME = "$ n" o solo el nombre del autor terminará en el índice. –

+4

Este script funciona bien. Sin embargo, después de haberlo aplicado, una llamada a "git svn rebase" causa el mensaje de error: "No se puede determinar la información de SVN en sentido ascendente desde el historial de árbol de trabajo". – olenz

+0

¿Cómo puede ir y volver a colocar los autores corregidos/corregidos en el control remoto? – user1027169

2

Probablemente desee consultar git-filter-branch, específicamente la opción --commit-filter. Este comando es una poderosa motosierra que puede reescribir todo el historial de repositorios, cambiando lo que sea que desee cambiar.

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

10

git filter-branch se puede utilizar para volver a escribir grandes fragmentos de la historia.

En este caso, es probable que hacer 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: con el fin de reescribir la historia, se necesita un conspiracy.

+0

Votación a favor de: "Como siempre, se aplica lo siguiente: para reescribir el historial, necesita una conspiración". Muy bien dicho. (Aunque el enlace ya no se carga) –

+0

¡Gracias! Repare los enlaces. –

+0

Te encontrarás con problemas con las expresiones regulares dadas si tienes un nombre svn que es un subconjunto de otro nombre svn ... Es por eso que dios nos dio '^' y '$'. – Dan