¿Cómo puedo get una sucursal de seguimiento remoto para estar al día con el origen remoto en un repository de Git desnudo?

Intento mantener una copy sin formatting de un repository de Git y tener algunos problemas para mantener actualizadas las twigs de seguimiento remoto. Creo las twigs de seguimiento remoto de esta manera:

git branch -t 0.1 origin/0.1 

Esto parece hacer lo que tengo que hacer en ese momento. Sin embargo, si realizo cambios en el origin y luego llevo con el repository desnudo, las cosas comienzan a desmoronarse. Mi flujo de trabajo se ve así:

 git fetch origin 

Parece que todas las confirmaciones entran en ese punto, pero mi copy local de 0.1 no se está actualizando. Puedo ver que los cambios se han llevado al repository haciendo lo siguiente:

 git diff 0.1 refs/remotes/origin/0.1 

¿Qué debo hacer para actualizar mi twig de seguimiento con las actualizaciones del control remoto? Siento que me falta un paso o una bandera en algún lado.

Actualizado: aclaración adicional

Normalmente uno empujaría en un repository desnudo, en lugar de ejecutar git fetch desde dentro. Si puede hacer eso, la vida será mucho más fácil.

Aquí hay un poco de aclaración sobre el flujo de trabajo.

El repository de git público del proyecto está alojado en GitHub. Estoy administrando el proyecto (wiki, issues, forums) usando Redmine. Redmine requiere un repository local para operar. Cuando GitHub recibe cambios, hace ping a Redmine. Redmine luego intenta get cambios de su origen (GitHub).

Esto funciona muy bien si solo estoy trabajando con el maestro, pero no funcionaba con mis twigs de seguimiento. Los cambios se estaban importando pero no se estaban enumerando en la sucursal del browser de repositorys Redmine porque las sucursales locales no se estaban actualizando.

Estoy seguro de que podría haber resuelto esto de otra manera, pero encontrar una solución (genérica) para poner en marcha las twigs de seguimiento fue definitivamente mi preference, ya que la mayoría de los complementos relacionados con git para Redmine suponen que el origen del git fetch es todo eso debe hacerse.

Vea la respuesta aceptada para la solución completa. La solución --mirror parece ser exactamente lo que se necesita en este caso.

Normalmente uno empujaría en un repository desnudo, en lugar de ejecutar git fetch desde dentro. Si puede hacer eso, la vida será mucho más fácil.

Si tiene que search en lugar de presionar, y solo desea crear un reflection de origen en su repository simple, podría evitar tener twigs de seguimiento remoto por completo. Si está comenzando este mirror desde cero, Charles Bailey señala a continuación que git hará toda esta configuration por usted si inicialmente clona el repository con git clone --mirror .

De lo contrario, podría get un efecto similar con:

 git fetch origin +refs/heads/*:refs/heads/* 

El + significa que esto sobrescribirá el estado de sus sucursales locales con las del control remoto. Sin el + , las actualizaciones que no son fusiones de avance rápido serán rechazadas. Sin embargo, si esto es solo un espejo, eso no debería importar. (Puede configurar esto para que sea la acción pnetworkingeterminada en el git fetch origin estableciendo la variable de configuration remote.origin.fetch en +refs/heads/*:refs/heads/* remote.origin.fetch +refs/heads/*:refs/heads/* . Si desea duplicar tags y rastreos de rastreo remoto desde origen también, podría usar +refs/*:refs/* lugar).

Sin embargo, si, como originalmente lo solicitó, desea mantener sucursales de rastreo remoto y combinarlas de manera selectiva en sucursales locales, puede seguir los siguientes pasos, pero no necesariamente las recomiendo a less que sea la única persona que use esta información. repository. (Nota: originalmente aquí sugerí usar "git symbolic-ref HEAD refs / heads / whatever" para cambiar de twig y "git reset –soft" para cambiar el ref de twig – sin embargo, Charles Bailey señaló en los comentarios que uno puede utilice "git update-ref refs / heads / whatever refs / remotes / origin / whatever", que no requiere uno para cambiar de twig primero).

En primer lugar, es posible que desee comprobar que la actualización de la sucursal hubiera sido una fusión de avance rápido y, luego, actualizar la sucursal. Tenga en count que aquí hay una condición de carrera, por lo que le digo que solo debe hacer esto si es la única persona que usa su repository local: el cheque sería inútil si alguien más se mueve en la twig entre esos pasos.

  1. Puede verificar que una fusión equivalente sería un avance rápido (es decir, que el historial de origin/master incluye el master ) al comparar git merge-base master origin/master con git show-ref master – deben ser iguales. O podría usar el guión is-ancestor en esta pregunta , que hace esos commands con algunas verificaciones adicionales).
  2. Finalmente, puede actualizar su twig actual ( master en este caso) para que apunte a origin/master con git update-ref refs/heads/master refs/remotes/origin/master

Sin embargo, como dije al principio, imagino que la verdadera solución que desea es:

  • Presionando en su repository vacío en su lugar o
  • Reflejando el repository desnudo remoto exactamente, como describí anteriormente

Espero que sea de alguna utilidad.

Cuando fetch , los cambios remotos actualizan su propia reference local para el control remoto, origin/0.1 (esto nunca causa ningún conflicto, ya que el origin/0.1 nunca alberga ningún cambio local). Para importar esos cambios, puede git reset refs/remotes/origin/0.1 desde 0.1 , lo que hará que la twig HEAD ( 0.1 ) apunte a la misma confirmación que la twig remota.

Tenga en count que al hacerlo perderá cualquier cambio a 0.1 no provenga del control remoto.