Estoy usando git-svn
para trabajar en contra del repositorio central de Subversion de mi compañía. Recientemente hemos creado una nueva rama de características en el repositorio central.
¿Cómo le digo a Git al respecto? Cuando corro git branch -r
solo puedo ver las ramas que existieron cuando corrí fetch
contra el repositorio de Subversion para inicializar mi repositorio de Git.
Respuestas:
Puede agregar manualmente la rama remota,
fuente
fatal: Cannot setup tracking information; starting point 'newbranch' is not a branch.
en el paso de pago git.Si desea rastrear TODAS las ramas remotas de svn, entonces la solución es tan simple como:
Esto buscará TODAS las ramas remotas que aún no se han obtenido.
Consejo adicional: si primero desprotegió el tronco y luego desea rastrear TODAS las ramas, edite
.git/config
para que se vea así y vuelva a ejecutargit svn fetch
:Los puntos clave
url
deben apuntar a la raíz del repositorio, y las rutas definidas enfetch
ybranches
deben ser relativas aurl
.Si desea buscar solo ramas específicas en lugar de TODAS, hay un buen ejemplo en
git svn --help
:Con versiones anteriores de
git-svn
, una vez que especificó ramas como esta, es posible que no pueda obtener nuevas ramasgit svn fetch
. Una solución es agregar másfetch
líneas, como esta:Otra solución alternativa de @AndyEstes: edite
.git/svn/.metadata
y cambie el valor debranches-maxRev
otags-maxRev
a una revisión antes de crear cualquier rama o etiqueta recién especificada. Una vez que haya hecho esto, ejecutegit svn fetch
para rastrear la nueva rama remota svn.fuente
.git/svn/.metadata
fue muy útil! Estaba agregando ramas adicionales en mi.git/config
, quegit svn fetch
no se repusieron, porque el número de revisión de metadatos estaba "demasiado lejos". En un caso, solo se obtuvo el último commit de una rama. Tengo manualmente deshacerse de la rama defectuosa (renombrado.git/svn/refs/remotes/svn/qa/XYZ
a.git/svn/refs/remotes/svn/qa/XYZ~
, dejó caer su existencia en.git/packed-refs
, etc) ... recogido un número de revisión "antes" de los metadatos ... RANgit svn fetch
para finalmente obtener un historial completo w / correcta gráfica, conectada.git svn fetch --all
.Parece que solo necesitaba hacerlo
git svn fetch
; De alguna manera, me había convencido de que obtendría todo el repositorio en lugar de solo los cambios.fuente
Tal vez lo arruiné de alguna manera, pero seguí las instrucciones en la respuesta de vjangus y casi funcionó. El único problema era que newbranch no parecía estar ramificado del tronco. En gitk, era una especie de "flotación" por sí solo; no tenía antepasado común con el tronco.
La solución a esto fue:
git diff-tree <sha1 from step 1> <sha1 from step 2>
- No debe haber salida. Si hay salida, es posible que haya seleccionado las confirmaciones incorrectas.git checkout local-newbranch
entoncesgit rebase <sha1 from step 1>
. Esto se basarálocal-newbranch
en el nuevo árbol peroremotes/newbranch
aún se desconectará..git/refs/remotes/newbranch
y edítelo para que contenga el SHA1 completo de la nueva confirmación (en el rebasenewbranch
) que corresponde a la confirmación anterior a la que apunta actualmente. (O tal vez usargit-update-ref refs/remotes/newbranch <new-SHA>
. Gracias inger.)git svn dcommit
anewbranch
, usted obtendrá un montón de mensajes acerca de que la actualización de algunos de registro. Esto es normal, creo.Recomiendo mantenerse
gitk --all
abierto todo el tiempo y actualizarlo a menudo para realizar un seguimiento de lo que está haciendo. Todavía soy algo nuevo en git y git svn, así que sugiera mejoras a este método.fuente
Una simplificación de la respuesta de vjangus:
Si está utilizando el diseño estándar en SVN y ha hecho el inicio svn habitual, git-svn hará las cosas de configuración por usted. Sólo:
Un ejemplo. SVN url es
svn+ssh://[email protected]/repo
. SVN sucursal que estoy buscando esnewbranch
. La rama local de git (seguimiento remotonewbranch
) serágit-newbranch
.Paso 1: busque la revisión de copia de sucursal
Entonces el punto de ramificación en SVN es la revisión 7802.
Paso 2: recuperar la revisión
git-svn hizo todo el trabajo y ahora sabe sobre el control remoto:
Paso 3: cree su nueva sucursal local siguiendo la remota:
fuente
show-ref
es invaluable)! Para cualquier persona atascada con referencias remotas erróneamente a las ramas, puede eliminarlas (tuve que hacerlogit branch -d newbranch
y luego forzar la eliminación del directorio de referencia.git/svn/refs/remotes/newbranch
) y luego comenzar de nuevo en el paso 2 (arriba).No he encontrado ninguna documentación sobre esta característica, pero parece que la configuración de git svn admite múltiples entradas de búsqueda. De esta manera, también puede agregar ramas por separado sin necesidad de agregar otra entrada de repositorio svn remota a su configuración ni usar comodines para obtener todas las ramas de cierto directorio.
Suponga que su árbol SVN es realmente desagradable con muchas ramas sin ninguna lógica de cómo están ubicadas, por ejemplo, tener ramas y subdirectorios que contienen más ramas.
es decir
y solo desea elegir a mano algunas de las ramas que se incluirán en su repositorio git.
Primero puede iniciar su repositorio con solo troncal sin ninguna rama adicional:
Después de eso, debería ver la siguiente configuración:
cuando quiera obtener una nueva sucursal de MyRepo, simplemente puede agregar nuevas entradas de recuperación a la configuración:
O puede editar la misma configuración en .git / config
Para buscar las nuevas ramas después de agregarlas a la configuración, simplemente ejecute:
[Editar] A veces parece necesario ejecutar fetch con --todos los parámetros para recuperar ramas recién agregadas:
fuente
En lugar de lidiar con las peculiaridades de git-svn, puede probar SubGit .
Uno tiene que instalar SubGit en el repositorio de Subversion. Después de eso, se puede usar el flujo de trabajo estándar de git en lugar de usar comandos especiales de git-svn:
Empujando nuevos commits:
git-svn:
SubGit:
Obteniendo cambios entrantes
git-svn:
SubGit:
Crear una nueva sucursal:
git-svn:
SubGit:
Consulte la documentación de SubGit para más detalles.
fuente
Para agregar a la respuesta de vjangus, que me ayudó, también me pareció útil agregar el uso de injertos git para atar las ramas al tronco en el punto apropiado, permitiendo que git vea el historial y realice fusiones correctamente.
Esto es simplemente un caso de agregar una línea a
.git/info/grafts
los hashes:p.ej.
Crédito a http://evan-tech.livejournal.com/255341.html
(Agregaría esto como un comentario, pero no tengo suficiente reputación).
fuente
Si no realiza un pago con un diseño válido, no podrá pagar una sucursal remota.
Esto es lo que hago:
Después de eso, puede cambiar a una rama remota:
Luego, se lo cambiará automáticamente a su sucursal.
fuente