Как мне получить только одну ветку удаленного Git-репозитория?

Я хотел бы получить одну ветку (не все) удаленного репозитория и создать локальную ветвь отслеживания, которая может отслеживать дальнейшие обновления этой удаленной ветки. Другие ветки в удаленном хранилище очень большие, поэтому я бы не хотел их извлекать. Как мне это сделать?

Изменить: Я сам понял это, но Stackru отказывается позволить мне предоставить ответ в качестве ответа, поэтому вместо этого я поставлю его здесь в вопросе.

Вы используете опцию -t для удаленного добавления git, например:

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

Вы можете использовать несколько-t branch"варианты, чтобы захватить несколько веток.

18 ответов

git fetch <remote_name> <branch_name>

Работал на меня.

Я знаю, что ответов уже много, но эти шаги помогли мне:

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

Они основаны на ответе @Abdulsattar Mohammed, комментарии @Christoph к этому ответу, а также на других вопросах о переполнении стека и их ответах:

Одним из способов является следующее:

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

Это не настроить отслеживание, хотя.

Для получения дополнительной информации см. Документацию git fetch.

РЕДАКТИРОВАТЬ: Как @user1338062 отмечает ниже: если у вас еще нет локального клона репозитория, в который вы хотите добавить новую ветку, но вы хотите создать свежий локальный репозиторий, то git clone --branch <branch_name> --single-branch <repo_url> обеспечивает более короткое решение.

Чтобы обновить существующий пульт для отслеживания определенных веток, используйте только:

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

От 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.

Один из способов сделать это:

в.git/config fetch для удаленного репозитория должен быть установлен выборки для любой ветки:

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

чтобы получить удаленную ветку:

git fetch origin branch-name

создать локальную ветку 'branch-name', настроенную для отслеживания удаленной ветки 'branch-name' от источника.

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

перечислить все филиалы

git branch -a

Скопировано с поста автора:

Использовать -t возможность git remote addНапример:

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

Вы можете использовать несколько -t branch варианты, чтобы захватить несколько ветвей.

Ответ на самом деле зависит от текущего списка имеющихся у вас веток отслеживания. Вы можете получить конкретную ветку с пульта с помощьюgit fetch <remote_name> <branch_name> только если ветка уже находится в списке ветвей отслеживания (вы можете проверить это с помощьюgit branch -r).

Предположим, я ранее клонировал пульт с опцией --single-branch, и в этом случае единственная имеющаяся у меня ветка отслеживания - это "клонированная". Меня немного сбивают с толку советы настроить git config вручную, а также набравgit remote add <remote_name> <remote_url>команды. Поскольку "git remote add" настраивает новый пульт, он явно не работает с существующим удаленным репозиторием; предоставление параметров "-t ветка" мне не помогло.

В случае, если пульт существует, и ветка, которую вы хотите получить, существует на этом пульте:

  1. Проверить с git branch -rможете ли вы видеть эту ветвь как ветвь отслеживания. Если нет (как в моем случае с одним клоном ветки), добавьте эту ветку в список ветвей отслеживания с помощью команды "git remote set-branch" с параметром --add:
  • git remote set-branches --add <remote_name> <branch_name>
  1. Получите ветку, которую вы добавили с пульта дистанционного управления:
  • git fetch <remote_name> <branch_name>Примечание: только после того, как новая ветвь отслеживания была получена с пульта дистанционного управления, вы можете увидеть ее в списке ветвей отслеживания с помощью git branch -r.
  1. Создайте и проверьте новую локальную ветку с помощью "checkout --track", которой будет присвоено то же имя "branch_name", что и ветке отслеживания:
  • git checkout --track <remote_name>/<branch_name>

Для полноты приведем пример команды для новой проверки:

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

Как уже упоминалось в других ответах, он устанавливает remote.origin.fetch как это:

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

Если вы хотите изменить значения по умолчанию для "git pull" и "git fetch", чтобы получать только определенные ветви, вы можете отредактировать.git/config так, чтобы удаленная конфигурация выглядела так:

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

По умолчанию это только выборка мастера из источника. См. Для получения дополнительной информации: https://git-scm.com/book/en/v2/Git-Internals-The-Refspec

РЕДАКТИРОВАТЬ: Просто понял, что это то же самое, что опция -t делает для git remote add. По крайней мере, это хороший способ сделать это после добавления пульта, если вы не хотите удалять пульт и добавлять его снова, используя -t.

Самый простой способ сделать это

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

Пример: я хочу получить ветку uat из источника и переключиться на нее как на текущую рабочую ветвь.

   git fetch origin uat && git checkout uat

Позвольте мне внести свои два пенса в :

  1. git fetch <remote_name_or_url> <branch_name>
  2. git checkout FETCH_HEAD -B <branch_name>

Основное преимущество этих двух линий над ответ мистера Мэдсенапредложением MrMadsen заключается в том, что они будут работать даже в том случае, если ветвь уже существует локально.

Мои обходные пути:

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

если у вас нет локального клона:

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

Версия git: 2.74

Вот как я это делаю:

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

Этот способ работает для меня.

получить удаленную ветку целевой ветки:

      git fetch origin branch-name

проверьте целевую ветку:

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

Здесь я успешно попытался получить release-20.10.08.

      name:directory zgong$ git fetch release-20.10.04 release-20.10.04
fatal: 'release-20.10.04' 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.
WM-C02WM0T3HTD8:vdca_android_20_10_04_stable zgong$ git fetch origin release-20.10.04
From ssh://stash.trusted.visa.com:7999/vdcbc3a/vmcp-android-mobile-app
 * branch                  release-20.10.04 -> FETCH_HEAD
WM-C02WM0T3HTD8:vdca_android_20_10_04_stable zgong$ git checkout -b release-20.10.08 origin/release-20.10.08
fatal: 'origin/release-20.10.08' is not a commit and a branch 'release-20.10.08' cannot be created from it
WM-C02WM0T3HTD8:vdca_android_20_10_04_stable zgong$ git fetch origin release-20.10.08
remote: Counting objects: 637, done.
remote: Compressing objects: 100% (320/320), done.
remote: Total 637 (delta 303), reused 465 (delta 202)
Receiving objects: 100% (637/637), 312.26 KiB | 262.00 KiB/s, done.
Resolving deltas: 100% (303/303), done.
From ssh://stash.trusted.visa.com:7999/vdcbc3a/vmcp-android-mobile-app
 * branch                  release-20.10.08 -> FETCH_HEAD
 * [new branch]            release-20.10.08 -> origin/release-20.10.08
WM-C02WM0T3HTD8:vdca_android_20_10_04_stable zgong$ git checkout -b release-20.10.08 origin/release-20.10.08
M   VMCP/fmcore_android
M   VMCP/foundation_android
M   VMCP/mep_3ds_android
M   VMCP/mep_login_android
M   VMCP/mep_provisioning_and
Branch 'release-20.10.08' set up to track remote branch 'release-20.10.08' from 'origin'.
Switched to a new branch 'release-20.10.08'

Git версия 2.16.1.windows.4

Просто делаю git fetch remoteRepositoryName branchName (eg: git fetch origin my_local_branch) достаточно. Выборка будет выполнена, и будет создана новая локальная ветвь с тем же именем, и отслеживание будет установлено как удаленная ветвь.

Затем выполните git checkout branchName

В моем случае я хотел получить ветку без создания нового пульта, поэтому это сработало:

git fetch <remote url> <remote branch name>:<local branch name>

  1. Выберите любой <remote_name> вы хотели бы использовать (не стесняйтесь использовать originи пропустите шаг 1.)
  2. git remote add <remote_name> <remote_url>
  3. git fetch <remote_name> <branch>
  4. Выберите любой <your_local_branch_name> Вы хотели бы использовать. Может быть так же, как <branch>,
  5. git checkout <remote_name>/<branch> -b <your_local_branch_name>

Надеюсь, это поможет!

Ответ зависит от того, чего вы хотите достичь.

  1. Если это разовая сделка из другого репозитория и вам не нужна ссылка (например, для слияния запросов на вытягивание GitHub, где <remote_url> выглядит как https://github.com/USER/REPO.git), то вы можешь использовать:
            git checkout -b <local_branch> <local_branch_to merge_into>
    git pull <remote_url> <remote_branch>
    
  2. Если вы хотите обновить и отслеживать ветку, вы должны сначала установить удаленный доступ, и есть 4 альтернативы:
    1. Если вы клонируете новый репозиторий (например, работаете только с ним)
                git clone --single-branch --branch remote_branch remote_url
      
    2. Если вы добавляете новый пульт в свой рабочий каталог
                # multiple -t options are allowed
      git remote add -t <remote_branch> <remote_repo> <remote_url>
      
    3. Если вы добавляете ограничение ветки на существующий пульт в вашем рабочем каталоге
                # with --add it will add the branch instead of setting it
      # you can add multiple branches with multiple --add lines 
      # wildcards are allowed, 
      #   e.g. branch_v\* matching branch_v1, branch_v2, ...
      git remote set-branches [--add]  <remote_repo>  <remote_branch>
      
    4. Вы также можете пропустить ограничения, потому что клон по умолчанию извлекает только основную ветку, а удаленное добавление не извлекает ветки. Но тогда вам придется упоминать удаленную ветку все удаленные ветки все время, когда вы извлекаете remote_repo.
                git remote add <remote_repo> <remote_url>
      
    После настройки пульта вы можете получить удаленную ветку, оформить заказ и вытащить:
            # If you set only one <remote_branch> in the restrictions above (i.e no option 4), 
    # then you can omit it and still only <remote_branch> will be fetched
    git fetch <remote_repo> [<remote_branch>]
    # without -b the local branch name is guessed to be the same as the remote one
    git checkout --track [-b <local_branch>] <remote_repo>/<remote_branch>
    

Лучшая команда для проверки удаленного устройства и веток, которые уже были или будут получены, это git remote show <remote_repo>. Он печатает список ветвей в разделе «Удаленная ветвь:», а также сообщает, были ли они получены и отслеживаются ли они.

Вы также можете проверить ограничения веток на удаленном компьютере, перечислив известные удаленные ветки с помощью git branch -r, в комбинации с grepесли у вас много пультов, или проверив детали пульта в конфигурационном файле git .git/config. Он будет содержать такой раздел:

      [remote "<remote_repo>"]
    url = <remote_url>
    fetch = +refs/heads/<remote_branch>:refs/remotes/<remote_repo>/<remote_branch>

Редактирование файла конфигурации поможет изменить ограничения, но я согласен с @alexk, что это не очень хорошая идея.

ПРИМЕЧАНИЕ. Если ветки нет в списке веток удаленного (видимого в git remote showили файл конфигурации), то у вас не будет ссылки на него, git сохранит его во временном FETCH_HEAD и вы не сможете его отследить или использовать напрямую в git checkout. Это проблема, которая привела меня в эту тему (противоположная той, что в вопросе): я клонировал репо с клиентом GitHub. gh repo clone USER/REPOи он автоматически добавил «восходящий поток», разветвленный репозиторий, ограниченный только веткой «мастер». Мне не удалось проверить другие ветки, и я получаю такие ошибки, как «фатальная: '<remote_repo>/<remote_branch>' не является фиксацией, и из нее нельзя создать ветвь '<local_branch>'». Я исправил это с помощью: git remote set-branches <remote_repo> \*.

Другие вопросы по тегам