¿Cómo actualizo mi repositorio simple?


Respuestas:


83

Si desea duplicar todos los objetos del repositorio principal, haga esto dentro del repositorio principal:

git push --all <url-of-bare-repo>

Alternativamente, haga una búsqueda dentro del repositorio desnudo:

git fetch <url-of-main-repo>

No puede hacer un pull, porque un pull quiere fusionarse con HEADun repositorio desnudo que no tiene.

Puede agregarlos como controles remotos para ahorrar algo de escritura en el futuro:

git remote add <whatever-name> <url-of-other-repo>

Entonces puedes simplemente hacer

git push --all <whatever-name>

o

git fetch <whatever-name>

dependiendo del repositorio en el que se encuentre. Si <whatever-name>es así origin, incluso puede dejarlo por completo.

Descargo de responsabilidad: no soy un git guru. Si digo algo mal, ¡me gustaría ser iluminado!

Actualización: ¡Lee los comentarios!


77
Cuando hice un git-fetch --alldentro del repositorio desnudo, no vi las actualizaciones que había realizado en el repositorio principal, pero cuando las empujé desde el repositorio principal git push --all <url-of-bare-repo>sí las vi git log. Presumiblemente hay una explicación simple para esto: ¿alguien puede explicarlo?
— pho79

2
@Thomas - Sí, por "no vi" quiero decir git logque no muestra estas actualizaciones en el repositorio. (Tampoco lo hace git log --all, y tampoco lo hace un repositorio de trabajo creado al clonar el repositorio desnudo, ya sea a través git log --allo simplemente mirando los nuevos archivos que deberían aparecer allí). Es una prueba bastante rápida de ver por ti mismo. Principalmente tengo curiosidad por saber qué me estoy perdiendo.
— pho79

71
Si su repositorio más remoto es algo así como github, donde no tiene acceso, no puede ejecutar push, etc., puede hacerlo git fetch -q origin master:masterdentro de su repositorio desnudo local. Esto buscará las cosas nuevas de la rama maestra de github y actualizará su rama maestra local.
— Altreus

44
@Altreus De hecho master:masteres lo que se requiere para mover HEAD hacia adelante al del repositorio remoto. En mi caso, debido a un problema, no pude conectarme a nuestro repositorio desnudo porque faltaba git. Hasta que se resuelva, hago un túnel inverso y busco en el repositorio central usando: git fetch ssh://localhost:8765/... master:mastery funciona de maravilla. ¡Gracias!
— estani

3
@Altreus Si quieres todas las ramas, entonces puedes hacerlogit fetch origin *:*
— JBert

71

Creé un repositorio usando el siguiente comando

git clone --bare <remote_repo>

Luego intenté actualizar el clon desnudo usando la respuesta de Thomas, pero no funcionó para mí. Para que el repositorio simple se actualice (que es lo que creo que Let_Me_Be preguntaba), tuve que crear un repositorio espejo:

git clone --mirror <remote_repo>

Entonces podría ejecutar el siguiente comando en el repositorio reflejado para obtener las actualizaciones del repositorio principal:

git fetch --all

Encontré esta solución al leer Mirror a Git Repository Pulling


22
Para cambiar un repositorio desnudo existente a espejo, todo lo que necesita hacer es agregar 2 líneas al archivo de configuración de git en <REPO> .git / config. En la [remote "origin"]sección, agregue fetch = +refs/*:refs/*ymirror = true
— Isaac Betesh

@IsaacBetesh Me salvaste el día :)
— smc

54

La única solución además de recrear con git clone --mirrores de Gregor :

git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

entonces puedes git fetchy verás las actualizaciones. Lo extraño es que antes de esto, a pesar de que hay una remoteconfiguración, no tiene ramas en la lista git branch -a.


1
¡Esto realmente me ayudó! Capistrano project / repo también usa esta configuración para permitir que One-liner git remote updatehaga el trabajo.
— Minqi Pan

1
Si el control remoto tiene ramas actualizadas o eliminadas a la fuerza (y desea reflejar esos cambios), es posible que deba agregar --forcey, --prunerespectivamente, a la git fetchlínea.
— Elliott Slaughter

46

Asumiendo:

$ git clone --bare https://github.com/.../foo.git

Buscar con:

$ git --git-dir=foo.git fetch origin +refs/heads/*:refs/heads/* --prune

Nota: --git-dir=foo.gitno es necesario si cdprimero va al directorio.


2
Aunque no sé cuándo ocurre eso, si originno está definido, siempre puede reemplazar la originparte con la ruta / url a su repositorio original. Por ejemplo$ git --git-dir=foo.git fetch https://github.com/.../foo.git +refs/heads/*:refs/heads/*
— antak

Esto es exactamente lo que estaba buscando. Esto funcionó perfectamente.
— Maxime Rouiller

13

Después de mucho perder el tiempo, he descubierto que esto funciona para mí.

Una vez:

git clone --mirror ssh://git@source.address:2000/repo
git remote add remote_site ssh://git@remote_site.address/repo
git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

Cada vez que quiero sincronizar:

cd /home/myhome/repo.git
git --bare fetch ssh://git@source.address:2000/repo
git  fetch ssh://git@source.address:2000/repo
git push --mirror remote_site

77
La tercera línea ( git config remote.origin.fetch 'refs/heads/*:refs/heads/*') es la clave. Buena respuesta, gracias!
— peterh - Restablecer Monica

2
Como dijo @peterh, la línea git config remote.origin.fetch 'refs/heads/*:refs/heads/*'es la respuesta. Después de presionar este comando, puedo simplemente git fetchy el repositorio se sincroniza con el remoto.
— bromista

3

Agregue el repositorio simple como un repositorio remoto, luego use git push.


Entonces, si quiero hacer esto sin presionar, ¿no puedo usar un repositorio simple y usar un enlace simbólico o algo así?
— Šimon Tóth

Empujar es el método normal para transferir contenidos del repositorio a un repositorio simple, no hay necesidad de evitarlo.
— Philipp

2
No siempre puedes empujar. Por ejemplo, si el bare está en una red privada, y los repositorios principales son públicos (en GitHub, por ejemplo)
— fanf42

0

Para mí esta combinación funcionó:

git remote add remote_site https://github.com/project/repo.git
git fetch -u remote_site +refs/heads/:refs/heads/*
git push --mirror

-u parámetro para buscar era necesario, de lo contrario me sale el mensaje de error: "Negarse a buscar en la rama actual refs / heads / master del repositorio no desnudo" (ver también https://stackoverflow.com/a/19205680/4807875 )

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.