2011-06-16 61 views
160

Tengo local & repositorios git remotos. Quiero sincronizar mi repositorio local con el repositorio remoto para que mi repositorio local se convierta en una copia del 100% del repositorio remoto. Lo que significa que si ciertos archivos difieren en estos repos, reemplazamos los locales por los remotos. Y si hay archivos en los repos locales que no existen en el repositorio remoto, los archivos locales se eliminan.git: sincronizar el repositorio local con el remoto

¿Hay alguna manera de lograr eso que no sea hacer un nuevo clon de repositorio remoto?

Pregunta similar a Sync local git repo with remote in one shot discarding local changes/commits.

+2

siempre cuando vengo aquí, estoy buscando [Sincronización de un tenedor] (https://help.github.com/articles/syncing-a-fork/) –

Respuesta

-2

Puede usar git hooks para eso. Simplemente crea un gancho que empuja cambiado al otro repositorio después de una actualización.

Por supuesto, es posible que tenga conflictos de fusión, por lo que debe averiguar cómo manejarlos.

81

Debe comprender que un repositorio de Git no es solo un árbol de directorios y archivos, sino que también almacena un historial de esos árboles, que pueden contener ramas y fusiones.

Al ir a buscar de un repositorio, copiará todas o algunas de las ramas allí en su repositorio. Estos se encuentran en su repositorio como "ramas de seguimiento remoto", p. ramas nombradas como remotes/origin/master o tal.

La recuperación de nuevas confirmaciones del repositorio remoto no cambiará nada en su copia local de trabajo.

Su copia de trabajo normalmente tiene un compromiso desprotegido, llamado HEAD. Este compromiso suele ser la punta de una de sus sucursales locales.

Creo que desea actualizar su sucursal local (¿o tal vez todas las sucursales locales?) A la sucursal remota correspondiente, y luego verifique la última sucursal.

Para evitar cualquier conflicto con su copia de trabajo (que podría tener cambios locales), primero limpie todo lo que no esté versionado (usando git clean). A continuación, consulte la sucursal local correspondiente a la sucursal remota a la que desea actualizar y utilice git reset para cambiarla a la sucursal remota recuperada. (git pull incorporará todas las actualizaciones de la sucursal remota en su local, que podría hacer lo mismo, o creará una fusión de confirmación si tiene confirmaciones locales.)

(Pero entonces perderá realmente cualquier cambio local, ambos en . copia y se compromete locales de trabajo Asegúrese de que realmente desea esto - de lo contrario usar mejor una nueva rama, esto ahorra sus commits locales y el uso git stash para guardar los cambios que aún no se han comprometido)


Editar:.. Si solo tiene una sucursal local y está rastreando una sucursal remota, todo lo que necesita hacer es

git pull 

desde dentro del directorio de trabajo.

Esto obtendrá la versión actual de todas las ramas remotas rastreadas y actualizará la rama actual (y el directorio de trabajo) a la versión actual de la rama remota que está rastreando.

+0

Si no cambian nada en mi local, repositorio, solo a.) quiere tener una copia de todo desde el control remoto, y b.) quiere una posibilidad mostrar diffs entre versiones. Entonces yo NO estoy comprometido, no estoy cambiando nada = no hay actualizaciones/cambios locales. ¿Qué comandos debo usar periódicamente (por ejemplo, cada semana más o menos) para lograr las dos funcionalidades anteriores? Por favor, responde KISS (Keep It Simple Stupid) - yo también soy un git noob, y de RTFM - pero para empezar necesito ayuda. ;) – kobame

+0

En su caso simple, un 'git pull' debería ser suficiente, creo. (Actualicé la respuesta.) –

+0

qué sucede si tengo algunos cambios locales que no quiero comprometer. Ahora cuando hago un tirón, me dice que los comprometa o los esconda. Entonces, en este caso, ¿cómo puedo decirle a git que los anule y haga el jalón? – Harshana

2

suena como usted quiere un espejo del repositorio remoto:

git clone --mirror url://to/remote.git local.git 

ese comando crea un repositorio desnudo. Si no quiere un repositorio simple, las cosas se vuelven más complicadas.

3

(Esta información es de The Git User's Manual)

También estoy aprendiendo, así que esto podría no ser exactamente una respuesta a la pregunta, pero que podía ayudar a:

  1. Cuando un repositorio remoto es inicialmente copias clonadas de todas las ramas se almacenan en su repositorio local (verlas con git branch -r)
  2. Para actualizar estas copias y hacerlas actuales (es decir, sincronizarlas con la rama remota) use git fetch. Esto no afectará a ninguna de sus ramas existentes creadas a medida.
  3. para anular su pago y envío rama local de una nueva versión de lo que sea la rama que se está trabajando (Asumiendo que ya ha ejecutado git add origin /path/to/repository) utiliza git checkout origin/branch_name, esto anulará los cambios gente local de la rama branch_name
73

Estos pasos harán que:

git reset --hard HEAD 
git clean -f -x -d -n 

continuación, sin -n

Esto se hará cargo de todos los cambios locales. Ahora las confirmaciones ...

git status 

y tomamos nota de la línea tales como:

Your branch is ahead of 'xxxx' by N commits. 

tomar nota del número 'N' ahora:

git reset --hard HEAD~N 
git pull 

y finalmente:

git status 

debe mostrar nada g para agregar/comprometer. Todo limpio.

Sin embargo, un clon nuevo puede hacer lo mismo (pero es mucho más lento).

=== === Actualización

Como mis conocimientos git ligeramente mejorado en el tiempo, me han llegado con otra forma más simple de hacer lo mismo. Aquí está cómo (#con explicación). Mientras que en su sucursal de trabajo:

git fetch # This updates 'remote' portion of local repo. 
git reset --hard origin/<your-working-branch> 
# this will sync your local copy with remote content, discarding any committed 
# or uncommitted changes. 

Aunque sus commits locales y cambios desaparecerán de la vista después de esto, es posible recuperar los cambios confirmados, si es necesario.

+1

muchas gracias por la actualización funciona perfectamente bien con github y bitbucket :) – commonSenseCode

+0

upvoted debido a la actualización – Tundebabzy

182
git fetch --prune 

-p, --prune
Después de ir a buscar, eliminar las ramas de seguimiento a distancia que ya no existen en el control remoto.prune options

+2

Eso es lo que estaba buscando! P.S. La próxima vez leeré las páginas man con más cuidado antes de excavar stackoverflow :-) – Serg

+2

¿Funcionó 'git pull' en este caso? –

+5

Sí, 'git pull -p' hace lo mismo - 'git pull ejecuta git fetch con los parámetros dados y llama a git merge para fusionar los encabezados de las ramas recuperadas en la rama actual' - http://git-scm.com/docs/git-pull – jobwat

36

que quiere hacer

git fetch origin 
git reset --hard origin/master 
git clean -f -d 

Esto hace que tu repositorio local, exactamente igual que tu repositorio remoto.

Recuerde reemplazar origen y maestro con el control remoto y la bifurcación con los que desea sincronizar.

+1

también elimina todos los directorios desde npm install y bower install, no recomendado a menos que desee volver a instalar todas las dependencias que están en .gitignore – chwagssd

+0

No eliminó mis 'node_modules', funciona exactamente como yo quiero. – VSG24

1

Si está hablando de sincronizar un repositorio bifurcado, puede seguir estos pasos.

Cómo sincronizar un repositorio tenedor de git

  1. comprobar su git branch actual

    git branch

  2. caja para dominar si usted no está en maestro

    git checkout master

  3. Fetch el repositorio aguas arriba si tiene derechos de acceso correctos

    git fetch upstream

  4. Si usted está recibiendo por debajo de error a continuación, ejecute

    git remote add upstream [email protected]:upstream_clone_repo_url/xyz.git

    fatal: 'upstream/master' does not appear to be a git repository 
    fatal: Could not read from remote repository. 
    Please make sure you have the correct access rights and the repository exists. 
    
  5. Ahora ejecute el comando a continuación.

    git fetch upstream

  6. Ahora bien, si usted está en maestro y luego fusionar los aguas arriba/master en rama principal

    git merge upstream/master

    Eso es todo !!

    Cruzada de git remote a través de comandos, más específica git remote -v

    Si también tengo permiso de commit en el repositorio de aguas arriba, puedo crear una rama aguas arriba local y hacer el trabajo que irá aguas arriba allí.

+0

¿Por qué debería hacer 5.git fetch upstream cuando ya recibo un error en el tercer paso? –

Cuestiones relacionadas