2011-06-16 8 views
160

J'ai local & dépôts git à distance. Je souhaite synchroniser mon référentiel local avec le référentiel distant afin que mon référentiel local devienne une copie à 100% du référentiel distant. Cela signifie que si certains fichiers diffèrent dans ces repos, nous remplaçons les fichiers locaux par ceux qui sont distants. Et s'il existe des fichiers dans des repos locaux qui n'existent pas dans le référentiel distant, les fichiers locaux sont supprimés.git: synchroniser le dépôt local avec un distant

Existe-t-il un moyen d'y parvenir autrement que de faire un nouveau clone de repo à distance?

La même question comme Sync local git repo with remote in one shot discarding local changes/commits.

+2

toujours quand je viens ici, je suis à la recherche [fourchette Synchroniser] (https://help.github.com/articles/syncing-a-fork/) –

Répondre

-2

Vous pouvez utiliser git hooks pour cela. Il suffit de créer un crochet qui pousse à l'autre repo après une mise à jour.

Bien sûr, vous pourriez avoir des conflits de fusion, donc vous devez comprendre comment les gérer.

81

Vous devez comprendre qu'un référentiel Git n'est pas seulement un arbre de répertoires et de fichiers, mais qu'il stocke également un historique de ces arbres - qui peuvent contenir des branches et des fusions.

Lorsque vous récupérez à partir d'un référentiel, vous copiez tout ou partie des branches dans votre référentiel. Ceux-ci sont ensuite dans votre référentiel en tant que "branches de suivi à distance", par ex. branches nommées remotes/origin/master ou similaire.

L'extraction de nouvelles validations à partir du référentiel distant ne changera rien à votre copie de travail locale.

Votre copie de travail a normalement un commit extrait, appelé HEAD. Ce commit est généralement la pointe de l'une de vos branches locales.

Je pense que vous voulez mettre à jour votre branche locale (ou peut-être toutes les branches locales?) À la branche distante correspondante, puis vérifiez la dernière branche.

Pour éviter tout conflit avec votre copie de travail (qui peut avoir des modifications locales), nettoyez d'abord tout ce qui n'est pas versionné (en utilisant git clean). Ensuite, vous vérifiez la branche locale correspondant à la branche distante que vous souhaitez mettre à jour, et utilisez git reset pour basculer vers la branche distante récupérée. (git pull incorporera toutes les mises à jour de la branche distante dans votre locale, qui pourrait faire la même chose, ou créer un commit de fusion si vous avez des commits locaux.)

(Mais alors vous perdrez vraiment tous les changements locaux - à la fois dans . copie de travail et commits locaux Assurez-vous que vous voulez vraiment cela - sinon mieux utiliser une nouvelle branche, cela permet d'économiser vos commits locaux et utiliser git stash pour enregistrer les modifications qui ne sont pas encore engagés)


Edit:.. Si vous avez une seule branche locale et que vous suivez une branche distante, tout ce que vous devez faire est

git pull 

depuis l'intérieur du répertoire de travail.

Ceci récupérera la version actuelle de toutes les branches distantes suivies et mettra à jour la branche actuelle (et le répertoire de travail) vers la version actuelle de la branche distante qu'elle suit.

+0

Si je rien changer dans mon locale référentiel, seulement un.) veulent avoir une copie de tout de la télécommande, et b.) veulent une possibilité de montrer diffs entre les versions. Donc, je ne m'engage pas, je ne change rien = pas de mises à jour/changements locaux. Quelles commandes dois-je utiliser périodiquement (par exemple chaque semaine environ) pour réaliser les deux fonctionnalités ci-dessus? S'il vous plaît, répondez KISS (Keep It Simple Stupid) - je suis un git noob aussi, et ofc RTFM - mais pour le début besoin d'aide. ;) – kobame

+0

Dans votre cas simple, un «git pull» devrait suffire, je pense. (J'ai mis à jour la réponse.) –

+0

et si j'ai quelques changements locaux que je ne veux pas commettre. Maintenant, quand je fais un pull il me dit de les commettre ou de les cacher. Alors, dans ce cas, comment puis-je dire à git de passer outre et de tirer? – Harshana

2

On dirait que vous voulez un miroir du dépôt distant:

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

Cette commande crée un dépôt nu. Si vous ne voulez pas de référentiel nu, les choses deviennent plus compliquées.

3

(Cette information est de The Git User's Manual)

J'apprends aussi, donc cela pourrait ne pas être exactement une réponse à la question, mais il peut aider quelqu'un:

  1. Lorsqu'un dépôt distant est initialement les copies clonées de toutes les branches sont stockées dans votre référentiel local (affichez-les avec git branch -r)
  2. Pour mettre à jour ces copies et les rendre actuelles (c'est-à-dire les synchroniser avec la branche distante), utilisez git fetch. Cela n'affectera aucune de vos branches existantes créées sur mesure.
  3. Pour remplacer votre caisse de la succursale locale une nouvelle version de ce que la branche sur lequel vous travaillez (en supposant que vous avez déjà exécuté git add origin /path/to/repository) utiliser git checkout origin/branch_name, ceci surpassera vos sections locales des changements sur la branche branch_name
73

Ces étapes feront il:

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

alors sans -n

Cela va prendre soin de tous les changements locaux. Maintenant, les commits ...

git status 

et notez la ligne tels que:

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

Prenez note du nombre 'N' maintenant:

git reset --hard HEAD~N 
git pull 

et enfin:

git status 

ne doit pas afficher g pour ajouter/commettre. Tout est propre. Toutefois, un clone frais peut faire la même chose (mais il est beaucoup plus lent).

=== === Mise à jour

Comme ma connaissance git légèrement améliorée par rapport au temps, je suis venu avec une autre façon plus simple de faire la même chose. Voici comment (#with explication). Alors que dans votre branche de travail:

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. 

Bien que vos commits locaux et les changements disparaîtront de vue après cela, il est possible de récupérer les modifications validées, le cas échéant.

+1

merci beaucoup pour la mise à jour fonctionne parfaitement bien avec github et bitbucket :) – commonSenseCode

+0

mis à jour à cause de la mise à jour – Tundebabzy

182
git fetch --prune 

-p, --prune
Après l'extraction, supprimez toutes les branches de suivi à distance qui n'existent plus sur la télécommande.prune options

+2

Voilà ce que je cherchais! P.S. La prochaine fois je lirai plus attentivement les pages de manuel avant de creuser stackoverflow :-) – Serg

+2

Est-ce que 'git pull' a fonctionné dans ce cas? –

+5

Oui, 'git pull -p' fait de même - 'git pull exécute git fetch avec les paramètres donnés et appelle git merge pour fusionner les têtes de branche récupérées dans la branche courante' - http://git-scm.com/docs/git-pull – jobwat

36

Vous voulez faire

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

Cela rend votre repo locale exactement comme votre pension à distance. N'oubliez pas de remplacer l'origine et le maître par la télécommande et la branche que vous souhaitez synchroniser.

+1

il supprime également tous les répertoires à partir de npm install et bower install, déconseillé à moins que vous ne souhaitiez réinstaller toutes les dépendances qui se trouvent dans .gitignore – chwagssd

+0

Il n'a pas supprimé mon 'node_modules', il fonctionne exactement comme je le souhaite. – VSG24

1

Si vous parlez de la synchronisation d'un repo fourchu, vous pouvez suivre ces étapes.

Comment synchroniser un répertoire fourchette de git

  1. vérifier votre branche git actuelle

    git branch

  2. caisse pour maîtriser si vous n'êtes pas maître

    git checkout master

  3. Fetch le dépôt en amont si vous disposez des droits d'accès corrects

    git fetch upstream

  4. Si vous obtenez ci-dessous erreur puis exécutez

    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. Maintenant, exécutez la commande ci-dessous.

    git fetch upstream

  6. Maintenant, si vous êtes sur le maître, puis fusionner en amont/maître dans la branche principale

    git merge upstream/master

    Ca y est !!

    Crosscheck via la commande git remote, plus spécifique git remote -v

    Si j'ai aussi engager des droits à la pension en amont, je peux créer une branche amont locale et faire un travail qui ira en amont là.

+0

Pourquoi devrais-je faire 5.git chercher en amont quand je reçois déjà une erreur à la troisième étape? –

Questions connexes