2010-10-05 5 views
12

Je configure un hook post-réception Github, qui exécute un script sur mon serveur Web chaque fois qu'un push est effectué dans mon référentiel Github. Lorsque le script s'exécute, je souhaite qu'il conserve un clone local du référentiel synchronisé avec mon référentiel Github. Pour ce faire, je l'ai exécuter cette commande:Récupération de toutes les branches distantes dans un référentiel Git vide

git fetch origin && git reset --soft refs/remotes/origin/master

Ensuite, si de mon poste de travail je pousse à maîtriser sur Github, tout fonctionne très bien. Toutefois, si je pousse vers une autre branche distante, les modifications ne sont pas reflétées dans le référentiel nu local de mon serveur.

Je suppose qu'il ya un moyen pour que le script récupère tous les des branches distantes, mais je ne sais pas comment faire. Je sais que les nouvelles versions de git ont une option --all pour fetch/pull, mais j'utilise git version 1.6.3.3, qui ne semble pas avoir cette option.

Est-ce que quelqu'un sait comment je peux obtenir mon script pour aller chercher toutes les branches distantes?

Merci!

+0

"Mise à niveau vers le dernier git" semble une solution assez simple, sûrement? – Ether

+0

Je suppose que je pourrais le faire. J'essaie juste d'éviter de jouer avec les paquets d'Ubuntu. – Tom

Répondre

2

Utilisez un script shell peut-être?

#!/bin/sh 

for i in `git remote show`; do 
    git fetch $i; 
done; 

Note: petite erreur de terminologie dans votre question: L'option de --allgit fetch|pull va chercher tous les "télécommandes" et non "succursales à distance".

+0

Merci pour l'info sur --all. Je n'ai pas réalisé cela. +1 :) – Tom

+0

Git 1.6.3 a 'git remote update', qui est une version intégrée de ceci. 'git fetch --all' est préféré dans les versions qui l'ont parce que la commande * git remote * est censée être pour maintenir la configuration des télécommandes, ne pas effectuer d'actions sur celles-ci (' update' est une anomalie à cet égard, donc la préférence pour 'git fetch --all'). –

0

Figuré Je fournirais ma propre solution pendant que j'y suis. J'ai accepté Ramkumar cependant, car c'était l'inspiration pour cela. La différence est que je ne veux pas chercher de toutes les télécommandes, mais chaque branche à distance dans « origine » ...

 

#!/bin/bash 
REMOTE_BRANCHES=$(git branch -r | awk -F'/' '{print $2}') 
for i in $REMOTE_BRANCHES; do 
    git fetch origin $i 
done 
 

AVERTISSEMENT: n'a pas vraiment encore mis en œuvre, mais il devrait être proche.

+1

Vous ne devriez vraiment pas essayer d'analyser la sortie de * git branch *. La commande "plumbing" de niveau inférieur * git for-each-ref * est conçue pour l'itération par script sur les noms de référence. Je suis surpris qu'un simple 'git fetch origin' ne mette pas à jour toutes vos branches de suivi à distance" origin/* ". Les utilisations itératives de 'git fetch origin branch-name' ne feront probablement pas non plus ce que vous voulez. Quand vous donnez * git fetch * une refspec sans deux-points (le dernier arg est la refspec), elle ne stocke que les commits récupérés dans l'arbitre spécial FETCH_HEAD (il ne mettra pas à jour vos branches de suivi à distance). –

+0

Je vois ce que vous voulez dire. Je ne connaissais pas la commande git for-each-ref. Merci! – Tom

19

git fetch origin '*:*' travaillé pour moi.

+0

Ceci! Vous n'avez pas besoin de boucles. – Piedone

+0

Si vous voulez juste des branches, utilisez 'refs/heads/*: refs/heads/*'. Si vous voulez juste des branches et des balises (exclure des choses comme des pulls github), ajoutez aussi 'refs/tags/*: refs/tags/*'. – Patrick

Questions connexes