2010-08-01 13 views
93

Creé un repositorio simple para publicar mi repositorio, pero no puedo encontrar la manera de actualizar el repositorio simple con el estado actual del repositorio principal.¿Cómo actualizo mi repositorio desnudo?

+2

Ver esta respuesta: http://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide/2964397#2964397 –

Respuesta

57

Si desea duplicar todos los objetos desde el repositorio principal, hacer esto dentro del repositorio principal:

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

Alternativamente, hacer una zona de alcance dentro de la cesión temporal al descubierto:

git fetch <url-of-main-repo> 

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

Puede agregar estos como mandos a distancia para ahorrar un poco de mecanografía en el futuro:

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

Entonces sólo puede hacer

git push --all <whatever-name> 

o

git fetch <whatever-name> 

dependiendo de lo reporto está dentro. Si <whatever-name> es origin, puede incluso dejarlo fuera en total r.

Descargo de responsabilidad: No soy un gurú de git. Si dije algo mal, ¡me gustaría estar iluminado!

Actualización: ¡Lee los comentarios!

+0

El impulso parece funcionar bien, gracias a la pista, creo que podré integrar esto en un gancho o algo similar. –

+4

Cuando hice un 'git-fetch --all' en el repositorio desnudo, no vi las actualizaciones que había hecho en el repositorio principal, pero cuando las sacaba del repositorio principal con' git push --all 'Veo las actualizaciones en' git log'. Es de suponer que hay una explicación simple para esto, ¿alguien puede explicar? – pho79

+0

¿Qué quiere decir con "no vi"? No estoy seguro de cómo 'git log' se comporta en un repositorio simple; tal vez intente 'git log --all'? – Thomas

3

Agregue el repositorio vacío como un repositorio remoto, luego use git push.

+0

Así que si quiero hacer esto sin presionar, no puedo usar un repositorio desnudo y usar un enlace simbólico o algo así? –

+0

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

+0

No siempre se puede presionar. Por ejemplo, si el descubierto está en una red privada, y el repositorio principal es público (en GitHub, por ejemplo) – fanf42

53

he creado un repositorio usando el siguiente comando

git clone --bare <remote_repo>

Luego trató de actualizar el clon desnuda usando la respuesta de Thomas, pero no funcionó para mí. Para obtener el repositorio desnudo para actualizar (que es lo que pienso Let_Me_Be estaba pidiendo), tuve que crear un repositorio espejo:

git clone --mirror <remote_repo> 

entonces podría ejecutar el siguiente comando en el repositorio de espejo para agarrar las actualizaciones del repositorio principal :

git fetch --all 

me encontré con esta solución mediante la lectura de Mirror a Git Repository By Pulling

+11

Para cambiar un repositorio desnudo existente al espejo, todo lo que necesita hacer es agregar 2 líneas al archivo de configuración de git en .git/config. En la sección '[remote" origin "]', agregue 'fetch = + refs/*: refs/*' y 'mirror = true' –

31

La única solución, además de recrear con git clone --mirror es from Gregor:

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

luego puede git fetch y verá las actualizaciones. Lo raro es que antes de esto, a pesar de que hay un remote configurado, no tiene ramas enumeradas en git branch -a.

+1

¡Esto realmente me ayudó! El proyecto/repositorio de Capistrano también usa esta configuración para permitir que la actualización remota 'git remote' haga el trabajo. –

+0

Si el control remoto tiene ramas actualizadas o eliminadas por la fuerza (y desea reflejar esos cambios), es posible que necesite agregar '--force' y' --prune' respectivamente a la línea 'git fetch'. –

4

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

vez:

git clone --mirror ssh://[email protected]:2000/repo 
git remote add remote_site ssh://[email protected]_site.address/repo 
git config remote.origin.fetch 'refs/heads/*:refs/heads/*' 

Cada vez que desea 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 
+1

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

26

Suponiendo:

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

Fetch con:

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

Nota: --git-dir=foo.git no es necesario si primero tiene cd en el directorio.

+2

Es extraño que esta respuesta no esté en la parte superior. Al menos funciona aquí ... –

+0

Hice un clon desnudo, y no hay origen ... – Kieveli

+2

Aunque no estoy al tanto de cuándo ocurre eso, si 'origin' no está definido, siempre puedes reemplazar el' origen' parte con la ruta/url a su repositorio original. p.ej. '$ git --git-dir = foo.git buscar https://github.com/.../foo.git + refs/heads/*: refs/heads/*' – antak

Cuestiones relacionadas