git svn dcommit en la sucursal local vuelve a crear el maestro local

Antecedentes :

Nuestro equipo necesita conectarse a un server svn y trabajar en una twig particular (no en el tronco svn). Además, necesitamos get el enlace y fusionarnos entre ellos.

He configurado un repository git local conectado a nuestra sucursal ("svn + ssh … project / branches / X").

Luego, he agregado manualmente el tronco como una nueva connection svn ("svn + ssh … project / trunk") (agregué un nuevo objective remoto para el tronco svn, a .git / config) y renombré mis twigs de la siguiente manera :

master (conectado a project / branches / X) pasó a llamarse master-X

la twig conectada al proyecto / troncal se renombró a troncal maestro.

Pregunta :

Cuando git svn dcommit en la twig local master-X, se crea una nueva twig 'master', con el mismo efecto que si lo hiciera:

 git svn dcommit git co master-X -b master 

¿Puedo evitar que se vuelva a crear la twig principal?

(cada vez que se crea, lo borro manualmente después).

Editar :

Mi .git / config ahora se ve así:

 # original/default configuration settings skipped for brevity [svn-remote "svn"] url = svn+ssh://...project/branches/X fetch = :refs/remotes/git-svn [svn-remote "svn-trunk"] url = svn+ssh://...project/trunk fetch = :refs/remotes/git-svn-trunk 

Las últimas tres líneas fueron agregadas por mí.

Este es el viejo comportamiento de Git, que se ha corregido en las últimas versiones de Git. Cualquier cosa más reciente que Git 1.7.12 ya no volverá a crear automáticamente una twig principal. Puede ejecutar git --version para get la versión de Git que está ejecutando actualmente.

No sirve de mucho si la versión que viene con su sistema operativo es anterior a la 1.7.12 (la última que tengo fácil acceso, entre mis sistemas Debian, RHEL y Cygwin, es 1.7.9).

Sin embargo, si lo desea, podrá realizar el cambio usted mismo. Encuentre la copy de git-svn o git-svn.perl en su sistema (en el mío, es /usr/lib/git-core/git-svn ), luego realice los siguientes cambios:

  • Debajo de Git::SVN::init_vars() , mueva el post_fetch_checkout(); alinee a antes del corchete de cierre, para que ese fragment de código se vea así:

     Git::SVN::init_vars(); eval { Git::SVN::verify_remotes_sanity(); $cmd{$cmd}->[0]->(@ARGV); post_fetch_checkout(); }; fatal $@ if $@; exit 0; 
  • En la subrutina post_fetch_checkout

    • Agregue la siguiente línea sobre la línea que comienza my $gs = :

       return if verify_ref('HEAD^0'); 
    • Elimine la línea que dice así:

       return if verify_ref('refs/heads/master^0') 
    • Reemplaza las siguientes líneas:

       my $valid_head = verify_ref('HEAD^0'); command_noisy(qw(update-ref refs/heads/master), $gs->refname); return if ($valid_head || !verify_ref('HEAD^0')); 

      con lo siguiente:

       command_noisy(qw(update-ref HEAD), $gs->refname); return unless verify_ref('HEAD^0); 

Los cambios anteriores aplicarán el parche que modificó este comportamiento en el código fuente de Git. Puedes verlo por ti mismo: el compromiso relevante es v1.7.11.2-250-ge3bd4dd por Marcin Owsiany.