¿Cómo le digo a git-svn acerca de una twig remota creada después de que fui a search el repository?

Estoy usando git-svn para trabajar en el repository svn central de mi empresa. Recientemente hemos creado una nueva twig de características en el repository central. ¿Cómo le digo a git sobre eso? Cuando ejecuto git branch -r solo puedo ver las twigs que existían cuando ejecuté " fetch contra el repository svn para inicializar mi git repo?

Puede agregar manualmente la twig remota,

 git config --add svn-remote.newbranch.url https://svn/path_to_newbranch/ git config --add svn-remote.newbranch.fetch :refs/remotes/newbranch git svn fetch newbranch [-r<rev>] git checkout -b local-newbranch -t newbranch git svn rebase newbranch 

Si desea rastrear TODAS las twigs remotas de svn, entonces la solución es tan simple como:

 git svn fetch 

Esto searchá TODAS las twigs remotas que aún no se han recuperado.

Sugerencia adicional: si primero .git/config al tronco y luego quieres rastrear TODAS las twigs, edita .git/config para que se vea así y vuelve a ejecutar git svn fetch :

 [svn-remote "svn"] url = https://svn/path_to_repo_root/ fetch = path_to_trunk:refs/remotes/git-svn branches = path_to_branches/*:refs/remotes/* 

Los puntos key son url debe apuntar a la raíz del repository, y las routes definidas en fetch y branches deben estar relacionadas con url .

Si quiere search solo twigs específicas en lugar de TODO, hay un buen ejemplo en git svn --help :

 [svn-remote "huge-project"] url = http://server.org/svn fetch = trunk/src:refs/remotes/trunk branches = branches/{networking,green}/src:refs/remotes/branches/* tags = tags/{1.0,2.0}/src:refs/remotes/tags/* 

Con versiones anteriores de git-svn , una vez que especifica twigs como esta, es posible que no pueda get nuevas twigs con git svn fetch . Una solución es agregar más líneas de fetch , como esta:

 [svn-remote "huge-project"] url = http://server.org/svn fetch = trunk/src:refs/remotes/trunk fetch = branches/blue:refs/remotes/branches/blue fetch = branches/yellow:refs/remotes/branches/yellow branches = branches/{networking,green}/src:refs/remotes/branches/* 

Otra solución de @AndyEstes: edite .git/svn/.metadata y cambie el valor de branches-maxRev o tags-maxRev a una revisión antes de que se creen las twigs o tags nuevas. Una vez que haya hecho esto, ejecute git svn fetch para rastrear la nueva twig remota de svn.

Parece que solo necesitaba git svn fetch ; de alguna manera me había convencido a mí mismo de que obtendría todo el repository en lugar de solo los cambios.

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 desde el tronco. En gitk, era algo así como "flotante" por sí mismo; no tenía un ancestro común con el tronco.

La solución a esto fue:

  1. Encuentra el SHA1 de la última confirmación que ocurrió en el tronco antes de que se creara la twig.
  2. Encuentra el SHA1 del primer commit en la nueva twig (el post probablemente sea "Nueva twig creada, copyda del tronco @ 12345" o algo)
  3. git diff-tree <sha1 from step 1> <sha1 from step 2> – no debería haber salida. Si hay salida, puede haber seleccionado las confirmaciones incorrectas.
  4. git checkout local-newbranch luego git rebase <sha1 from step 1> . Esto volverá a establecer local-newbranch base local-newbranch en el nuevo tree, pero remotes/newbranch aún se desconectarán.
  5. Vaya al file .git/refs/remotes/newbranch y .git/refs/remotes/newbranch para que contenga el SHA1 completo de la nueva confirmación (en la newbranch ) que corresponda al compromiso anterior al que apunta actualmente. (O tal vez use git-update-ref refs/remotes/newbranch <new-SHA> . Gracias, por favor.)
  6. La próxima vez que git svn dcommit a newbranch , recibirá un montón de posts sobre la actualización de algunos loggings. Esto es normal, creo.

Recomiendo mantener gitk --all abierto todo el time y actualizarlo a menudo para hacer un seguimiento de lo que estás haciendo. Todavía soy un poco nuevo en git y git svn así que sugiero mejoras a este método.

No he encontrado ninguna documentation sobre esta característica, pero parece que la configuration de git svn admite múltiples inputs de búsqueda. De esta forma, también puede agregar twigs por separado sin necesidad de agregar otra input de repository svn remoto a su configuration ni usar comodines para get todas las twigs de cierto directory.

Supongamos que su tree SVN es realmente desagradable teniendo muchas twigs sin ninguna lógica de cómo se encuentran, por ejemplo, tener twigs y subdirectorys que contengan más twigs.

es decir

 trunk branches -> branch1 -> sub-dir1 -> branch2 -> branch3 -> sub-dir2 -> branch4 -> sub-dir3 -> branchX <... hundnetworkings more ...> 

y solo quieres elegir algunas de las twigs para includelas en tu repository de git.

Primero puede iniciar su repository con solo tronco sin twigs adicionales:

 git svn clone -r 10000:HEAD https://svn.com/MyRepo myrepo --prefix=svn/ --trunk=trunk 

Después de eso, debería ver la siguiente configuration:

 localhost: elhigu$ git config --get-regexp "svn-remote." svn-remote.svn.url https://svn.com/MyRepo svn-remote.svn.fetch trunk:refs/remotes/svn/trunk 

cuando quiera search una nueva twig de MyRepo, puede agregar nuevas inputs de recuperación a la configuration de la siguiente manera:

 git config --add svn-remote.svn.fetch branches/sub-dir2/branch4:refs/remotes/svn/branches/sub-dir2/branch4 

O puede editar la misma configuration en .git / config

Para search las nuevas twigs después de agregarlas a la configuration solo ejecuta:

 git svn fetch -r 10000:HEAD 

[Editar] A veces parece necesario ejecutar fetch con –todo el parámetro para search twigs recién agregadas:

 git svn fetch --all -r 10000:HEAD 

En lugar de lidiar con las peculiaridades de git-svn, puedes probar SubGit .

Uno tiene que instalar SubGit en el repository de Subversion. Después de eso, uno puede usar el flujo de trabajo estándar de git en lugar de usar commands especiales de git-svn:

  1. Empujando nuevos commits:

    git-svn:

     $ git commit $ git svn rebase $ git svn dcommit 

    SubGit:

     $ git commit $ git push 
  2. Obteniendo cambios entrantes

    git-svn:

     $ git svn rebase 

    SubGit:

     $ git pull [--rebase] 
  3. Creando una nueva twig:

    git-svn:

     $ git svn branch foo $ git checkout -b foo -t remotes/foo $ git commit $ git svn dcommit 

    SubGit:

     $ git checkout -b foo $ git commit $ git push 

Vea la documentation de SubGit para más detalles.

Una simplificación de la respuesta de vjangus:

Si está utilizando el layout estándar en SVN y ha hecho el habitual svn init, git-svn hará las cosas de configuration por usted. Sólo:

  1. Buscar revisión de copy de twig en SVN
  2. Obtener esa revisión con git-svn
  3. Crear un nuevo control remoto de seguimiento local

Un ejemplo. La URL de SVN es svn+ssh://gil@svn.myplace.com/repo . La twig SVN que estoy buscando es newbranch . La sucursal local de git (rastreo de newbranch remota) será git-newbranch .

Paso 1: encuentra la revisión de copy de twig

     # svn log --stop-on-copy svn + ssh: //gil@svn.myplace.com/repo/branches/newbranch |  queue -4
     r7802 |  alguien |  2014-03-21 18:54:58 +0000 (vie, 21 de marzo de 2014) |  1 línea

     ramificación HEAD a newbranch
     -------------------------------------------------- ----------------------

Entonces, el punto de ramificación en SVN es la revisión 7802.

Paso 2: get la revisión

     # git svn fetch -r 7802
     Se encuentra un posible punto de ramificación: svn + ssh: //gil@svn.myplace.com/repo/trunk => svn + ssh: //gil@svn.myplace.com/repo/branches/newbranch, 7801
     Madre principal encontrada: (refs / remotes / trunk) 8dcf3c5793ff1a8a79dc94d268c91c2bf388894a
     Siguiente padre con do_switch
     Siguió con éxito al padre
     r7802 = 9bbd4194041675ca5c9c6f3917e05ca5654a8a1e (refs / remotos / newbranch)

git-svn hizo todo el trabajo y ahora sabe sobre el control remoto:

     # git show-ref |  grep newbranch
     2df23af4733f36f5ad3c14cc1fa582ceeb3edb5c refs / remotos / newbranch

Paso 3: crea tu nueva sucursal local rastreando la remota:

     # git checkout -b git-newbranch -t newbranch
     Verificación de files: 100% (413/413), hecho.
     Branch git-newbranch configurado para rastrear los ref refs / remotos / newbranch locales.
     Cambió a una nueva twig 'git-newbranch'

Para agregar a la respuesta de vjangus, que me ayudó, también me pareció útil agregar git injertos para unir las twigs al tronco en el punto apropiado, lo que permite a git ver el historial y realizar las fusiones correctamente.

Esto es simplemente un caso de agregar una línea a .git/info/grafts con los valores hash:

 <initial branch commit> <parent commit in trunk> 

p.ej.

 378b0ae0902f5c2d2ba230c429a47698810532e5 6c7144991381ce347d4e563e9912465700be0638 

Crédito a http://evan-tech.livejournal.com/255341.html

(Agregaría esto como comentario, pero no tengo suficiente reputación).

Si no realiza el check-out con un layout válido, no podrá realizar compras en una sucursal remota.

Esto es lo que hago:

 git svn init -s <svn path with no trunk> local_repo cd local_repo git svn fetch ## wait 

Después de eso, puedes cambiar a una twig remota:

 git checkout --track -b branch_name branch_name 

Luego se cambiará automáticamente a su sucursal.