web-dev-qa-db-fra.com

Différences entre la mise à jour à distance et la récupération?

Est git remote update l'équivalent de git fetch?

171
David

UPDATE: plus d'informations!

J'aurais dû le faire depuis le début: j'ai salué les notes de publication de Git dans le dépôt Git de Git (donc méta!)

grep --color=always -R -C30 fetch Documentation/RelNotes/* | less

Ensuite, j'ai fait une recherche less pour --all, Et voici ce que j'ai trouvé dans les notes de publication de Git version 1.6.6 :

git fetch A appris les options --all Et --multiple, Pour exécuter l'extraction depuis de nombreux référentiels, et l'option --Prune Pour supprimer les branches de suivi distantes devenues obsolètes. Celles-ci font que git remote update Et git remote Prune Sont moins nécessaires (il n'y a aucun plan pour supprimer remote update Ni remote Prune, Cependant).

La version 1.6.6 n'est sortie que le 23 décembre 2009 , et l'affiche originale a posé sa question le 6 décembre 2009.

Comme vous pouvez le voir dans les notes de publication, les auteurs de Git étaient conscients du fait que la fonctionnalité de commande git remote update Était en quelque sorte dupliquée par git fetch, Mais ils ont décidé de ne pas la supprimer, peut-être. pour la compatibilité ascendante avec les scripts et les programmes existants, ou peut-être parce que c'est trop de travail et qu'il y a des éléments de priorité plus élevés.


Réponse originale avec plus de détails

La réponse de xenoterracide a maintenant 3,5 ans et Git a passé plusieurs versions depuis (elle est passée de v1.6.5.5 à la v1.8.3.2 à la date de rédaction de ce document), et en regardant la documentation actuelle pour git remote update et git fetch , on dirait qu'ils both peut effectuer essentiellement la même fonction d'extraction de nouveaux commits à partir de plusieurs télécommandes, avec les bonnes options et les bons arguments.

Aller chercher toutes les télécommandes

L’une des méthodes permettant d’extraire plusieurs télécommandes consiste à utiliser l’option --all:

git fetch --all

Cela ira de toutes vos télécommandes configurées, en supposant que vous n’ayez pas réglé remote.<name>.skipFetchAll Pour elles:

Si true, cette télécommande sera ignorée par défaut lors de la mise à jour avec git-fetch (1) ou la sous-commande update de git-remote (1) . - documentation git-config

Cela équivaudrait à utiliser

git remote update

sans spécifier aucun groupe distant à extraire, ni aussi que remotes.default soit défini dans votre configuration de référentiel, et qu'aucune de vos télécommandes ne possède remote.<name>.skipDefaultUpdate définie sur true.

La documentation actuelle 1.8.3.2 de la configuration de Git ne mentionne pas le paramètre remotes.default, Mais j'ai consulté le tout-puissant Google et trouvé cette explication utile provenant de Mislav Marohnić :

$ git config remotes.default 'Origin mislav staging'
$ git remote update

# fetches remotes "Origin", "mislav", and "staging"

Vous pouvez définir une liste par défaut de télécommandes à récupérer avec la commande remote update. Ceux-ci peuvent être des télécommandes de vos coéquipiers, des membres de la communauté de confiance d'un projet opensource ou similaire.

Donc, vraisemblablement, si remotes.default Est défini et que toutes vos télécommandes ne sont pas répertoriées, alors git remote update Ne récupérera pas toutes les télécommandes dont votre référant est "conscient".

En ce qui concerne le paramètre remote.<name>.skipDefaultUpdate, , les documents Git l'expliquent comme suit:

Si true, cette télécommande sera ignorée par défaut lors de la mise à jour avec git-fetch (1) ou la sous-commande update de git-remote (1) .

Récupération d'un groupe spécifié de télécommandes

Au lieu de récupérer toutes les télécommandes, fetch et remote update Vous permettent de spécifier plusieurs télécommandes et groupes de télécommandes à récupérer:

git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)…]

git fetch [<options>] <group> Vous permet de récupérer plusieurs télécommandes appartenant à un groupe (pour emprunter un autre exemple à Mislav ):

$ git config remotes.mygroup 'remote1 remote2 ...'
$ git fetch mygroup

git fetch --multiple Vous permet de spécifier plusieurs référentiels et groupes de référentiels à extraire simultanément (à partir de les documents ):

Autorise la spécification de plusieurs arguments <repository> Et <group>. Aucun <refspec>s Ne peut être spécifié.

Ambiguïté dans la documentation de git remote update

Le synopsis pour git remote update indique que la syntaxe de la commande est la suivante:

git remote [-v | --verbose] update [-p | --Prune] [(<group> | <remote>)…]

Remarquez la dernière partie, [(<group> | <remote>)…]? Les points finaux ... Impliquent que vous pouvez spécifier plusieurs groupes et télécommandes avec la commande, ce qui voudrait dire qu'elle se comporte de la même manière que git fetch --multiple ... voyez comment la syntaxe entre les deux est si similaire?

Cependant, dans le même document, l’explication de la commande update ne dit rien sur la spécification de plusieurs arguments de groupe et à distance, mais seulement

Récupérer [es] mises à jour pour un ensemble nommé de télécommandes dans le référentiel tel que défini par remotes.<group>.

Il est donc difficile de savoir si git remote update Fonctionne de manière identique à git fetch --multiple En ce qui concerne la spécification de plusieurs télécommandes individuelles et de plusieurs groupes distants.

Aller chercher une seule télécommande

Enfin, tout le monde connaît le cas simple de chercher une seule télécommande:

git fetch <remote>

Il se peut que vous puissiez également utiliser

git remote update <remote>

faire la même chose, mais comme je l’ai mentionné dans la section précédente, la documentation de git remote update ne permet pas de savoir s’il est possible d’extraire autre chose qu’un simple group des télécommandes avec la commande.

Emballer

Comme je l'ai expliqué, git fetch Et git remote update Se comportent de la même manière en ce qui concerne l'extraction de plusieurs télécommandes. Ils partagent la même syntaxe et les mêmes arguments, même si git fetch Est plus court, de sorte que les gens trouvent probablement plus facile à taper et à utiliser.

Il se peut que git remote update Ne puisse pas être utilisé pour extraire une seule télécommande, comme avec git fetch, Mais comme je l’ai indiqué, la documentation ne le dit pas clairement.

À part

La duplication des fonctionnalités entre les commandes de porcelaine Git, illustrée par git fetch Et git remote update Ci-dessus, n'est pas unique. J'ai remarqué une situation similaire avec git rebase --onto et git cherry-pick , dans la mesure où les deux peuvent prenez une série de commits pour appliquer un nouveau commit de base.

Je suppose que Git ayant évolué au fil des ans, certaines fonctionnalités ont été (inévitablement?) Dupliquées, peut-être parfois pour la commodité des utilisateurs finaux (par exemple, il est plus simple de passer une plage à cherry-pick, Que de passer une seule validation encore et encore pour choisir une plage). Apparemment, cherry-pick N'a pas toujours accepté une plage de validations, comme expliqué dans les notes de version v1.7.2 :

git cherry-pick A appris à choisir une plage de commits (par exemple, cherry-pick A..B Et cherry-pick --stdin), De même que git revert; ceux-ci ne supportent pas le meilleur contrôle de séquençage rebase [-i], cependant.

101
user456814

Oui et non. git remote update va chercher dans toutes les télécommandes, pas seulement une.

Sans regarder le code pour voir si remote update n'est qu'un script Shell (possible), il exécute la récupération pour chaque télécommande. git fetch peut être beaucoup plus granulaire.

141
xenoterracide