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

247

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

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

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

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

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

Mellis
источник
3
Git-клон извлекает весь репозиторий, включая все ветви. Вы можете делать мелкие копии, но это позволяет только указать количество ревизий, а не какие ветви.
Икке
Конечно, вы можете ответить на свой вопрос, почему не можете?
CharlesB
2
Я думаю, что ОП означало, что он не мог ответить на это тогда. StackOverflow устанавливает минимальное время, которое должно пройти, прежде чем вы сможете ответить на свой вопрос.
Ларс Нордин
1
Привет, ОП, было бы неплохо добавить свой ответ сейчас. Таким образом, мы можем проголосовать за него (и сравнить с другими ответами)
Лулалала
3
Ваша команда git remote add добавляет удаленную ветку, которая не имеет ничего общего с получением ветки!
Крис Холкроу

Ответы:

220
git fetch <remote_name> <branch_name>

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

Абдулсаттар Мухаммед
источник
14
Только что узнал, что извлеченная ветка доступна как FETCH_HEADпосле извлечения. Спасибо!
Кристоф
4
затем git checkout FETCH_HEADк оформлению
заказа
Просто и легко.
gsumk
Как получить <remote_name>?
mrgloom
@mrgloom в большинстве случаев remote_nameесть origin. Например:git fetch origin <branch_name>
Саахитян Виньесваран
67

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

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

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

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

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

hcs42
источник
1
Спасибо, это делает то, что оп попросил. Чтобы сделать отслеживание ветки git checkout -t <удаленная ветка> / <имя ветки> <имя ветки>
ken
7
Если я просто это сделаю git checkout <branchname>, я вижу, что git автоматически устанавливает ветку отслеживания, если единственной веткой с таким именем является удаленная ветка.
Букзор
1
это было единственное, что сработало для меня. хотя конфигурация была настроена на выборку ссылок только для одной ветви, она все равно вытягивала ссылки на все ветви, используя fetch или pull. эта команда вытащила только ту ветвь, которую я хотел, поэтому репо было только 500 КБ, а не 5 МБ. Спасибо.
Herostwist
1
Этот ответ, вероятно, устарел. git cloneСейчас поддерживаются --branchи --single-branchварианты, я выложил ответ с демонстрацией .
user1338062
3
@ user1338062 Это все еще действует, если вы хотите получить только новую ветвь (не все ветки, использующие git fetch) после клонирования
rubyprince
35

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

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

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

MrMadsen
источник
1
Самый полезный ответ здесь ИМО
Даниэль Холмс
31

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

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.
Икар Похорски
источник
1
Удивительно, я был в --single-branchрепозитории и не смог загрузить дополнительные ветки позже. Спасибо!
Яхо
22

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

в .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
klode
источник
16

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

Используйте -tопцию git remote add, например:

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

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

космонавт
источник
10
Downvoted, почему вы отвечаете с существующим ответом в той же теме?
Боуэн
13

Если вы хотите изменить значения по умолчанию для «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.

ColinM
источник
1
progit.org/book/ch9-5 ссылка переместилась на git-scm.com/book/en/Git-Internals-The-Refspec
здесь
8

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

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
user1338062
источник
5

версия git: 2.74

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

git remote add [REMOTE-NAME] [REMOTE-URL]
git fetch [REMOTE-NAME] -- [BRANCH]
scottalan
источник
4

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

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

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

Картикеян Мохан
источник
1
ветка не появится, git branchпока вы не
оформите
3

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

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

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

git clone --depth 1 -b <branch_name> <repo_url>
LIy
источник
3
  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>

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

Лукаш Червинский
источник
2

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

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

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

  1. Проверьте git branch -r, можете ли вы видеть эту ветку как отслеживающую ветку. Если нет (как в моем случае с одним клоном ветки), добавьте эту ветку в список веток отслеживания с помощью «git remote set-branch» с параметром --add:

    • git remote set-branches --add <remote_name> <branch_name>
  2. Теперь вы можете получить определенную ветку (продублируйте здесь другие ответы):

    • git fetch <remote_name> <branch_name>
  3. И создайте и извлеките новую локальную ветку с помощью «checkout --track», которому будет присвоено то же «branch_name», что и для отслеживающей ветви:

    • git checkout --track <remote_name>/<branch_name>
AlexK
источник
0

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

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

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

   git fetch origin uat && git checkout uat
Amitesh
источник