¿Cómo actualizo mi repositorio simple?

134

Creé un repositorio simple para publicar mi repositorio, pero no puedo entender cómo actualizar el repositorio simple con el estado actual del repositorio principal.

Šimon Tóth
fuente
2
Vea esta respuesta: stackoverflow.com/questions/315911/…
Ken Bloom

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!

Thomas
fuente
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

austero
fuente
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.

Colin D Bennett
fuente
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.

antak
fuente
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://[email protected]: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://[email protected]:2000/repo
git  fetch ssh://[email protected]:2000/repo
git push --mirror remote_site
simonvc
fuente
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.

Philipp
fuente
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 )

Alexander Samoylov
fuente