Comment récupérer une seule branche d'un référentiel Git distant?


246

Je voudrais saisir une seule branche (pas toutes) d'un référentiel distant et créer une branche de suivi locale qui peut suivre les mises à jour supplémentaires de cette branche distante. Les autres branches du référentiel distant sont très grandes, donc j'aimerais éviter de les chercher. Comment puis-je faire cela?

Edit: J'ai compris cela moi-même, mais StackOverflow refuse de me laisser fournir la réponse comme réponse, donc je vais le mettre ici dans la question à la place.

Vous utilisez l'option -t pour ajouter à distance, par exemple:

git remote add -t remote-branch remote-name remote-url

Vous pouvez utiliser plusieurs -t branchoptions " " pour saisir plusieurs branches.


3
Un clone git récupère l'ensemble du référentiel, y compris toutes les branches. Vous pouvez faire des copies superficielles, mais cela vous permet uniquement de spécifier le nombre de révisions, pas les branches.
Ikke

Bien sûr, vous pouvez répondre à votre propre question, pourquoi pas vous?
CharlesB

2
Je pense que le PO signifiait qu'il ne pouvait pas y répondre alors. StackOverflow définit un temps minimum qui doit s'écouler avant que vous puissiez répondre à votre propre question.
Lars Nordin

1
Salut OP, il serait peut-être bien maintenant d'ajouter votre réponse. De cette façon, nous pouvons voter dessus (et comparer avec les autres réponses)
lulalala

3
Votre commande git remote add ajoute une branche distante, ce qui n'a rien à voir avec la récupération d'une branche!
Chris Halcrow

Réponses:


220
git fetch <remote_name> <branch_name>

A travaillé pour moi.


14
Je viens d'apprendre que la branche extraite est disponible comme FETCH_HEADaprès l'extraction. Merci!
Christoph du

4
puis git checkout FETCH_HEADà la caisse
d9k

Simple et facile.
gsumk

Comment obtenir <nom à distance>?
mrgloom

@mrgloom dans la plupart des cas remote_nameest origin. Par exemple:git fetch origin <branch_name>
Saahithyan Vigneswaran

67

Une façon est la suivante:

git fetch <remotename> <remote branch>:refs/remotes/<remotename>/<local branch>

Cependant, cela ne configure pas le suivi.

Pour plus d'informations, consultez la documentation de git fetch .

EDIT : Comme le note @ user1338062 ci - dessous : si vous ne disposez pas déjà d'un clone local du référentiel où vous souhaitez ajouter la nouvelle branche, mais que vous souhaitez créer un nouveau référentiel local, alors la git clone --branch <branch_name> --single-branch <repo_url>fournit une solution plus courte.


1
Merci, cela fait ce que l'op a demandé. Pour créer une branche de suivi git checkout -t <branche distante> / <nom de la branche> <nom de la branche>
ken

7
Si je le fais simplement git checkout <branchname>, je vois que git configure automatiquement la branche de suivi, si la seule branche avec ce nom est la branche distante.
bukzor

1
c'était la seule chose qui fonctionnait pour moi. même si la configuration a été définie pour extraire uniquement les références pour une seule branche, elle a quand même extrait les références de toutes les branches à l'aide de la fonction d'extraction ou d'extraction. cette commande n'a tiré que la branche que je voulais, donc le dépôt n'était que de 500 Ko et non de 5 Mo Merci.
herostwist

1
Cette réponse est probablement dépassée. git clonemaintenant supports --branchet --single-branchoptions, j'ai posté une réponse avec démonstration .
user1338062

3
@ user1338062 Ceci est toujours valide si vous voulez récupérer une nouvelle branche uniquement (pas toutes les branches utilisant git fetch) après le clonage
rubyprince

35

Je sais qu'il y a déjà beaucoup de réponses, mais ce sont les étapes qui ont fonctionné pour moi:

  1. git fetch <remote_name> <branch_name>
  2. git branch <branch_name> FETCH_HEAD
  3. git checkout <branch_name>

Ceux-ci sont basés sur la réponse de @Abdulsattar Mohammed, le commentaire de @Christoph sur cette réponse, et ces autres questions de débordement de pile et leurs réponses:


1
Réponse la plus utile ici OMI
Daniel Holmes

31

Pour mettre à jour la télécommande existante pour suivre des branches spécifiques, utilisez uniquement:

git remote set-branches <remote-name> <branch-name>

De git help remote:

set-branches
    Changes the list of branches tracked by the named remote. This can be used to track a subset of the available remote branches
    after the initial setup for a remote.

    The named branches will be interpreted as if specified with the -t option on the git remote add command line.

    With --add, instead of replacing the list of currently tracked branches, adds to that list.

1
Étonnant, j'étais dans un --single-branchréférentiel et je n'ai pas pu télécharger de branches supplémentaires plus tard. Merci!
Yajo

22

Une façon de le faire:

dans .git / config fetch pour le dépôt distant doit être défini pour récupérer n'importe quelle branche:

   [remote "origin"]
            fetch = +refs/heads/*:refs/remotes/origin/*

pour récupérer la branche distante:

git fetch origin branch-name

pour créer une branche locale 'nom-branche' configurée pour suivre la branche distante 'nom-branche' depuis l'origine.

git checkout -b branch-name origin/branch-name

pour lister toutes les branches

git branch -a

16

Copié du post de l'auteur:

Utilisez l' -toption pour git remote add, par exemple:

git remote add -t remote-branch remote-name remote-url

Vous pouvez utiliser plusieurs -t branchoptions pour saisir plusieurs branches.


10
Voté, pourquoi répondez-vous avec une réponse existante dans le même fil?
Bowen

13

Si vous souhaitez modifier la valeur par défaut pour "git pull" et "git fetch" pour extraire uniquement des branches spécifiques, vous pouvez modifier .git / config pour que la configuration distante ressemble à:

[remote "origin"]
  fetch = +refs/heads/master:refs/remotes/origin/master

Par défaut, cela récupérera uniquement le maître de l'origine. Voir pour plus d'informations: https://git-scm.com/book/en/v2/Git-Internals-The-Refspec

EDIT: Je viens de réaliser que c'est la même chose que l'option -t pour git remote add. Au moins, c'est une bonne façon de le faire après l'ajout de la télécommande si vous ne voulez pas supprimer la télécommande et l'ajouter à nouveau à l'aide de -t.


1
Le lien progit.org/book/ch9-5 a été déplacé vers git-scm.com/book/en/Git-Internals-The-Refspec
ici

8

Par souci d'exhaustivité, voici un exemple de commande pour un nouveau paiement:

git clone --branch gh-pages --single-branch git://github.com/user/repo

Comme mentionné dans d'autres réponses, il définit remote.origin.fetchcomme ceci:

[remote "origin"]
        url = git://github.com/user/repo
        fetch = +refs/heads/gh-pages:refs/remotes/origin/gh-pages

5

version git: 2.74

Voici comment je le fais:

git remote add [REMOTE-NAME] [REMOTE-URL]
git fetch [REMOTE-NAME] -- [BRANCH]

4

git version 2.16.1.windows.4

Je fais juste un git fetch remoteRepositoryName branchName (eg: git fetch origin my_local_branch) . La récupération sera effectuée et une nouvelle branche locale sera créée avec le même nom et le suivi sera défini sur une branche distante.

Effectuez ensuite git checkout branchName


1
la branche n'apparaît pas git branchtant que vous ne l'avez pas
enregistrée

3

Mes solutions:

git fetch --depth=1
git checkout <branch_name>

si vous n'avez pas de clone local:

git clone --depth 1 -b <branch_name> <repo_url>

3
  1. Choisissez celui que <remote_name>vous souhaitez utiliser (n'hésitez pas à utiliser origin et ignorez l'étape 1.)
  2. git remote add <remote_name> <remote_url>
  3. git fetch <remote_name> <branch>
  4. Choisissez celui que <your_local_branch_name>vous souhaitez utiliser. Pourrait être le même que <branch>.
  5. git checkout <remote_name>/<branch> -b <your_local_branch_name>

J'espère que cela pourra aider!


1

La réponse dépend en fait de la liste actuelle des branches de suivi que vous avez. Vous pouvez récupérer une branche spécifique à distance avec git fetch <remote_name> <branch_name> uniquement si la branche est déjà sur la liste des branches de suivi (vous pouvez la vérifier avecgit branch -r ).

Supposons que j'ai cloné la télécommande avec l'option --single-branch auparavant, et dans ce cas, la seule branche de suivi que j'ai est celle "clonée". Je suis un peu déconcerté par les conseils pour modifier manuellement la configuration de git, ainsi que par la saisie de git remote add <remote_name> <remote_url>commandes. Comme "git remote add" configure une nouvelle télécommande, cela ne fonctionne évidemment pas avec le référentiel distant existant; fournir des options "-t branch" ne m'a pas aidé.

Dans le cas où la télécommande existe et la branche que vous souhaitez récupérer existe dans cette télécommande:

  1. Vérifiez git branch -rsi vous pouvez voir cette branche comme une branche de suivi. Sinon (comme dans mon cas avec un seul clone de branche), ajoutez cette branche à la liste des branches de suivi par "git remote set-branches" avec l'option --add:

    • git remote set-branches --add <remote_name> <branch_name>
  2. Vous pouvez maintenant récupérer une branche spécifique (dupliquez ici les autres réponses):

    • git fetch <remote_name> <branch_name>
  3. Et créez et extrayez une nouvelle branche locale avec "checkout --track", qui recevra le même "nom_branche" qu'une branche de suivi:

    • git checkout --track <remote_name>/<branch_name>

0

La façon la plus simple de le faire

  git fetch origin <branch> && git checkout <branch>

Exemple: je veux récupérer la branche uat de l'origine et passer à celle-ci en tant que branche de travail actuelle.

   git fetch origin uat && git checkout uat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.