Как мне получить только одну ветку удаленного Git-репозитория?
Я хотел бы получить одну ветку (не все) удаленного репозитория и создать локальную ветвь отслеживания, которая может отслеживать дальнейшие обновления этой удаленной ветки. Другие ветки в удаленном хранилище очень большие, поэтому я бы не хотел их извлекать. Как мне это сделать?
Изменить: Я сам понял это, но Stackru отказывается позволить мне предоставить ответ в качестве ответа, поэтому вместо этого я поставлю его здесь в вопросе.
Вы используете опцию -t для удаленного добавления git, например:
git remote add -t remote-branch remote-name remote-url
Вы можете использовать несколько-t branch
"варианты, чтобы захватить несколько веток.
18 ответов
Я знаю, что ответов уже много, но эти шаги помогли мне:
git fetch <remote_name> <branch_name>
git branch <branch_name> FETCH_HEAD
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 ветка" мне не помогло.
В случае, если пульт существует, и ветка, которую вы хотите получить, существует на этом пульте:
- Проверить с
git branch -r
можете ли вы видеть эту ветвь как ветвь отслеживания. Если нет (как в моем случае с одним клоном ветки), добавьте эту ветку в список ветвей отслеживания с помощью команды "git remote set-branch" с параметром --add:
git remote set-branches --add <remote_name> <branch_name>
- Получите ветку, которую вы добавили с пульта дистанционного управления:
git fetch <remote_name> <branch_name>
Примечание: только после того, как новая ветвь отслеживания была получена с пульта дистанционного управления, вы можете увидеть ее в списке ветвей отслеживания с помощьюgit branch -r
.
- Создайте и проверьте новую локальную ветку с помощью "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
Позвольте мне внести свои два пенса в :
-
git fetch <remote_name_or_url> <branch_name>
-
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>
- Выберите любой
<remote_name>
вы хотели бы использовать (не стесняйтесь использоватьorigin
и пропустите шаг 1.) git remote add <remote_name> <remote_url>
git fetch <remote_name> <branch>
- Выберите любой
<your_local_branch_name>
Вы хотели бы использовать. Может быть так же, как<branch>
, git checkout <remote_name>/<branch> -b <your_local_branch_name>
Надеюсь, это поможет!
Ответ зависит от того, чего вы хотите достичь.
- Если это разовая сделка из другого репозитория и вам не нужна ссылка (например, для слияния запросов на вытягивание 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>
- Если вы хотите обновить и отслеживать ветку, вы должны сначала установить удаленный доступ, и есть 4 альтернативы:
- Если вы клонируете новый репозиторий (например, работаете только с ним)
git clone --single-branch --branch remote_branch remote_url
- Если вы добавляете новый пульт в свой рабочий каталог
# multiple -t options are allowed git remote add -t <remote_branch> <remote_repo> <remote_url>
- Если вы добавляете ограничение ветки на существующий пульт в вашем рабочем каталоге
# 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>
- Вы также можете пропустить ограничения, потому что клон по умолчанию извлекает только основную ветку, а удаленное добавление не извлекает ветки. Но тогда вам придется упоминать удаленную ветку все удаленные ветки все время, когда вы извлекаете 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> \*
.