He estado haciendo todo mi trabajo en Git y presionando a GitHub. He estado muy contento con el software y el sitio, y no deseo cambiar mis prácticas de trabajo en este momento.
Mi asesor de doctorado está pidiendo a todos los estudiantes que mantengan su trabajo en un repositorio SVN alojado en la universidad. He encontrado toneladas de documentación y tutoriales a punto de extraer un repositorio SVN existente en Git, pero nada sobre empujar un repositorio Git a un nuevo repositorio SVN. Supongo que debe haber alguna forma de hacerlo con una combinación de git-svn y una nueva rama y rebase y todos esos términos maravillosos, pero soy un novato de Git y no me siento seguro con ninguno de ellos.
Luego, solo quiero ejecutar un par de comandos para enviar confirmaciones a ese repositorio SVN cuando elijo. Deseo seguir usando Git y solo hacer que el repositorio SVN refleje lo que hay en Git.
Seré la única persona que se comprometa con SVN, si esto hace alguna diferencia.
Respuestas:
También necesitaba esto, y con la ayuda de la respuesta de Bombe + algunos retoques, lo hice funcionar. Aquí está la receta:
Importar Git -> Subversion
Después del n. ° 3, recibirá un mensaje críptico como este:
Solo ignora eso.
Cuando se ejecuta # 5, se puede conseguir conflictos. Resuélvalos agregando archivos con el estado "no combinado" y reanudando el rebase. Eventualmente, habrás terminado; luego sincronice nuevamente al repositorio SVN, usando
dcommit
. Eso es todo.Mantener los repositorios sincronizados
Ahora puede sincronizar desde SVN a Git, utilizando los siguientes comandos:
Y para sincronizar de Git a SVN, use:
Nota final
Es posible que desee probar esto en una copia local, antes de aplicar a un repositorio en vivo. Puede hacer una copia de su repositorio Git en un lugar temporal; simplemente use
cp -r
, ya que todos los datos están en el repositorio mismo. Luego puede configurar un repositorio de pruebas basado en archivos, utilizando:Y verifique una copia de trabajo usando:
Eso te permitirá jugar con las cosas antes de hacer cambios duraderos.
Anexo: Si te equivocas
git svn init
Si accidentalmente ejecuta
git svn init
con la URL incorrecta, y no fue lo suficientemente inteligente como para hacer una copia de seguridad de su trabajo (no pregunte ...), no puede ejecutar el mismo comando nuevamente. Sin embargo, puede deshacer los cambios emitiendo:Y eliminar la sección
[svn-remote "svn"]
sección.Entonces puedes correr de
git svn init
nuevo.fuente
Así es como lo hicimos funcionar:
Clone su repositorio Git en algún lugar de su máquina.
Abra .git / config y agregue lo siguiente (desde Mantener un espejo SVN de solo lectura de un repositorio Git ):
Ahora, desde una ventana de consola, escriba estos:
Ahora, si se rompe aquí por cualquier razón, escriba estas tres líneas:
Y finalmente, puedes comprometerte con SVN:
Nota: Siempre descarto esa carpeta después.
fuente
Unable to determine upstream SVN information from HEAD history.
git merge -s recursive -Xtheirs --allow-unrelated-histories master
.Usar
git rebase
directamente perderá la primera confirmación. Git lo trata de manera diferente y no lo puede refrenar.Hay un procedimiento que preservará la historia completa: http://kerneltrap.org/mailarchive/git/2008/10/26/3815034
Transcribiré la solución aquí, pero los créditos son para Björn.
Inicialice git-svn:
El --prefix le da ramas de seguimiento remoto como "svn / trunk", lo cual es bueno porque no obtiene nombres ambiguos si llama a su rama local solo "trunk". Y
-s
es un acceso directo para el diseño estándar de troncales / etiquetas / ramas.Obtener las cosas iniciales de SVN:
Ahora busque el hash de su confirmación raíz (debe mostrar una confirmación única):
Luego obtenga el hash del commit de tronco vacío:
Crea el injerto:
Ahora, "gitk" debería aparecer
svn/trunk
como la primera confirmación en la que se basa su rama maestra.Hacer el injerto permanente:
Suelta el injerto:
gitk aún debería aparecer
svn/trunk
en la ascendencia del maestro.Linealice su historial en la parte superior del tronco:
Y ahora "git svn dcommit -n" debería decirle que se va a comprometer con trunk.
fuente
Cree un nuevo directorio en el repositorio de Subversion para su proyecto.
Cambie a su proyecto administrado por Git e inicialice git-svn.
Esto creará una única confirmación porque el directorio de su proyecto SVN todavía está vacío. Ahora vuelva a basar todo en ese compromiso,
git svn dcommit
y ya debería haber terminado. Sin embargo, arruinará seriamente tus fechas de confirmación.fuente
Git -> SVN con historial de confirmación completo
Tenía un proyecto Git y tuve que moverlo a SVN. Así es como lo hice, manteniendo todo el historial de confirmaciones. Lo único que se pierde es el tiempo de confirmación original, ya que libSVN establecerá la hora local cuando lo hagamos
git svn dcommit
.Cómo:
Tener un repositorio SVN donde queremos importar nuestras cosas y clonarlo con git-svn:
Ve allí:
Agregue el control remoto del repositorio Git (en este ejemplo estoy usando C: /Projects/repo.git ). Desea pasar a SVN y darle el nombre old-git:
Obtenga la información de la rama maestra desde el repositorio de git antiguo al repositorio actual:
Verifique la rama maestra del control remoto old-git en una nueva rama llamada old en el repositorio actual:
Rebase para colocar el HEAD encima de old-git / master. Esto mantendrá todos tus commits. Lo que esto hace básicamente es tomar todo su trabajo realizado en Git y ponerlo encima del trabajo al que accede desde SVN.
Ahora regrese a su rama maestra:
Y puede ver que tiene un historial de confirmación limpio. Esto es lo que quieres enviar a SVN.
Empuje su trabajo a SVN:
Eso es todo. Está muy limpio, no se piratea, y todo funciona perfectamente fuera de la caja. Disfrutar.
fuente
git svn
se necesitan pocas preparaciones.Propondría una instrucción muy corta en 4 comandos usando SubGit . Ver esta publicación para más detalles.
fuente
Necesitaba confirmar mi repositorio Git existente en un repositorio SVN vacío.
Así es como logré hacer esto:
Funcionó sin problemas. Espero que esto ayude a alguien.
Como tenía que autorizarme con un nombre de usuario diferente al repositorio SVN (mi
origin
usa autenticación de clave privada / pública), tuve que usar la--username
propiedad.fuente
git-svn
antes de que esto sea posible, consulte stackoverflow.com/questions/527037/git-svn-not-a-git-commandSi desea seguir trabajando con Git como su repositorio principal y solo necesita "exportar" las revisiones a SVN de vez en cuando, puede usar Tailor para mantener el repositorio SVN sincronizado. Puede copiar revisiones entre diferentes sistemas de control de fuente y actualizaría el SVN con los cambios que realice en Git.
No he intentado una conversión de Git a SVN, pero para un ejemplo SVN -> SVN, vea esta respuesta .
fuente
Otra secuencia que funcionó (con algunos comentarios en cada paso):
Instalar
git-svn
ysubversion
kits de herramientas:Cambiar dentro del
PROJECT_FOLDER
Cree la ruta del proyecto en el servidor de Subversion (desafortunadamente el
git-svn
complemento actual tiene un defecto en comparación con TortoiseSVN). No puede almacenar el código fuente directamente en elPROJECT_FOLDER
. En cambio, de forma predeterminada, cargará todo el códigoPROJECT_FOLDER/trunk
.svn mkdir - protocolo de los padres: /// ruta / a / repo / PROJECT_FOLDER / trunk -m "crear marcador de posición de repositorio git"
Este es el lugar donde
trunk
al final del camino es obligatorioInicialice el
git-svn
contexto del complemento dentro de la.git
carpetaEste es el lugar donde
trunk
al final del camino es innecesarioObtener una
Subversion
información de repositorio vacíaEste paso está ayudando a sincronizar el servidor Subversion con el
git-svn
complemento. Este es el momento en que elgit-svn
complemento establece laremotes/origin
ruta y la asocia con latrunk
subcarpeta en el lado del servidor.Rebase las confirmaciones de Git anteriores antes de que el
git-svn
complemento se involucrara en el proceso (este paso es opcional )Agregue archivos nuevos / modificados para confirmar (este paso es regular para las actividades de Git y es opcional )
Confirme los archivos recién agregados en el repositorio local de Git (este paso es opcional y solo es aplicable si se ha utilizado el paso 7):
Empujar todo el proyecto cambia el historial en el servidor de Subversion:
fuente
Puede hacer un nuevo repositorio SVN. Exporte su proyecto Git (desarrollando los archivos .git). Agréguelo al repositorio SVN (inicializando el repositorio con lo que tenía hasta ahora en Git). Luego, use las instrucciones para importar repositorios SVN en un proyecto Git nuevo.
Pero esto perderá tu historial anterior de Git.
fuente
Si no tiene que usar ningún SVN específico y está usando GitHub, puede usar su conector SVN.
Más información está aquí: Colaborando en GitHub con Subversion
fuente
Me gustaría compartir una gran herramienta que se utiliza en la comunidad de WordPress llamada Scatter
Complementos de Git WordPress y un poco de dispersión de cordura
Esto permite a los usuarios poder enviar su repositorio Git a wordpress.org SVN automáticamente. En teoría, este código se puede aplicar a cualquier repositorio SVN.
fuente
Recientemente tuve que migrar varios repositorios de Git a SVN, y después de probar todas las soluciones que pude encontrar, lo que finalmente funcionó para mí fue Mercurial (sí, usando un tercer VCS). Usando esta guía , se me ocurrió el siguiente proceso (en Linux, pero la idea básica también debería funcionar en Windows).
Los paquetes necesarios:
Mercurial debe configurarse agregando lo siguiente a
~/.hgrc
:Cree algunos directorios de trabajo temporales (tenía que migrar varios repositorios, así que creé directorios para las versiones SVN y Git, para mantenerlos separados):
Haga un repositorio SVN local vacío:
Clonar el repositorio Git existente:
Deje que Mercurial haga lo suyo:
Ahora el repositorio SVN debería contener el historial de confirmación completo, pero no con las marcas de tiempo originales. Si esto no es un problema, omita la siguiente parte del paso 11.
Con un poco de trabajo, la fecha y la hora de cada confirmación se pueden cambiar . Dado que mis repositorios son bastante pequeños, me fue posible hacerlo manualmente. Primero, cree un
pre-revprop-change
enlace en el repositorio SVN con los siguientes contenidos, para permitir que se modifique la propiedad necesaria:Este script tiene que hacerse ejecutable:
Mercurial creó una copia de trabajo del repositorio SVN, llamado project -wc, así que cambie a él y edite los tiempos de confirmación:
Ingrese la fecha y hora correctas (¡preste atención a las zonas horarias!) Y guarde. Debería recibir un mensaje que dice "Establecer un nuevo valor para la propiedad svn: fecha de revisión 1".
Ahora enjuague y repita para cada otra revisión.
Opcionalmente, verifique el historial de confirmación para asegurarse de que todo se vea bien:
Luego vuelve a subir un nivel:
Volcar el repositorio:
Y cargue el volcado en su servidor Subversion. ¡Hecho!
Este proceso probablemente también funcionaría directamente entre repositorios remotos, pero me resultó más fácil trabajar con los locales. Arreglar los tiempos de confirmación fue mucho trabajo, pero en general el proceso fue mucho más directo que cualquier otro método que encontré.
fuente
Hay tres métodos:
rebase : como las otras respuestas
commit id: encuentre svn first commit id y git first commit id, haga eco de ellos en .git / info / grafts:
echo "git_id svn_id}" > .git/info/grafts
luegogit svn dcommit
compruebe cada confirmación de git, copie archivos en svn_repo, svn commit
demostración de bash: demostración de github
v1.x: use rebase y commit id
v2.x: use archivos de copia, luego svn commit
fuente
En mi caso, tuve que iniciar un proyecto limpio desde SVN
agregue todas las fuentes de su proyecto ...
fuente
Solo quiero compartir algo de mi experiencia con la respuesta aceptada. Hice todos los pasos y todo estuvo bien antes de ejecutar el último paso:
Encontré el hilo https://github.com/nirvdrum/svn2git/issues/50 y finalmente la solución que apliqué en el siguiente archivo en la línea 101 /usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm
Reemplacé
con
Esto solucionó mi problema.
fuente
¿Qué sucede si no desea confirmar cada confirmación que realiza en Git, en el repositorio SVN? ¿Qué sucede si solo desea enviar confirmaciones selectivamente? Bueno, tengo una mejor solución.
Mantengo un repositorio local de Git donde todo lo que hago es buscar y fusionar desde SVN. De esa manera puedo asegurarme de incluir todos los mismos cambios que SVN, pero mantengo mi historial de confirmaciones completamente separado del SVN.
Luego mantengo una copia de trabajo local SVN separada que está en una carpeta separada. Ese es el que hago confirmaciones a SVN, y simplemente uso la utilidad de línea de comando SVN para eso.
Cuando estoy listo para confirmar el estado de mi repositorio local de Git en SVN, simplemente copie todo el desorden de archivos en la copia de trabajo local de SVN y lo confirmo desde allí usando SVN en lugar de Git.
De esta manera, nunca tengo que hacer un rebase, porque el rebase es como una base libre.
fuente