Как мне клонировать одну ветку в Git?
У меня есть локальный репозиторий Git под названием 'skeleton', который я использую для хранения скелетов проекта. Имеет несколько филиалов для разных видов проектов:
casey@agave [~/Projects/skeleton] git branch
* master
rails
c
c++
Если я хочу проверить основную ветку для нового проекта, я могу сделать
casey@agave [~/Projects] git clone skeleton new
Initialized empty Git repository in /Users/casey/Projects/new/.git/
и все как я хочу. В частности, новая основная ветвь указывает на главную ветвь скелета, и я могу толкать и тянуть, чтобы перемещаться вокруг изменений в базовой настройке проекта.
Что не работает, однако, если я хочу клонировать другую ветку. Я не могу получить его так, чтобы я потянул только ту ветку, которую хочу, например rails
ветвь, а затем новый репозиторий имеет master
ветвь, которая выталкивает и извлекает из хранилища скелета rails
ветка, по умолчанию.
Есть ли хороший способ сделать это? Или, может быть, это не тот способ, которым Git хочет, чтобы я структурировал вещи, и я, безусловно, открыт для этого. Возможно, у меня должно быть несколько репозиториев, с хранилищем скелетов Ruby on Rails, отслеживающим главное хранилище скелетов? И любой отдельный проект, клонирующий хранилище Ruby on Rails.
29 ответов
Примечание: git1.7.10 (апрель 2012) фактически позволяет вам клонировать только одну ветку:
# clone only the remote primary HEAD (default: origin/master)
git clone --single-branch
as in:
git clone <url> --branch <branch> --single-branch [<folder>]
Вы можете увидеть это в t5500-fetch-pack.sh
:
test_expect_success 'single branch clone' '
git clone --single-branch "file://$(pwd)/." singlebranch
'
Tobu комментирует, что:
Это подразумевается при выполнении мелкого клона.
Это делаетgit clone --depth 1
Самый простой способ сохранить пропускную способность.
Начиная с Git 1.9.0 (февраль 2014 г.), мелкие клоны поддерживают передачу данных (push/pull), поэтому эта опция стала еще более полезной.
Смотрите больше на " Есть git clone --depth 1
(мелкий клон) полезнее, чем кажется? ".
"Отмена" мелкого клона подробно описана в разделе " Преобразование мелкого клона в полный клон " (git 1.8.3+).
# unshallow the current branch
git fetch --unshallow
# for getting back all the branches (see Peter Cordes' comment)
git config remote.origin.fetch refs/heads/*:refs/remotes/origin/*
git fetch --unshallow
Как Chris комментирует:
волшебная линия для получения недостающих ветвей, чтобы повернуть вспять
--single-branch
is (git v2.1.4):
git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
git fetch --unshallow
Одним из способов является выполнение следующего.
git clone user@git-server:project_name.git -b branch_name /your/folder
куда branch_name
это ветка по вашему выбору, а "/your/folder" - папка назначения для этой ветки. Это правда, что это принесет другие ветви, дающие вам возможность сливаться взад и вперед. Теперь, начиная с Git 1.7.10, теперь вы можете сделать это
git clone user@git-server:project_name.git -b branch_name --single-branch /your/folder
Используя Git версии 1.7.3.1 (в Windows), вот что я делаю ($BRANCH
это название филиала я хочу оформить заказ и $REMOTE_REPO
URL удаленного репозитория, с которого я хочу клонировать):
mkdir $BRANCH
cd $BRANCH
git init
git remote add -t $BRANCH -f origin $REMOTE_REPO
git checkout $BRANCH
Преимущество этого подхода заключается в том, что последующий git pull
(или же git fetch
) звонки также просто скачают запрошенную ветку.
git clone <url> --branch <branch> --single-branch
Просто введите URL и название филиала.
Вы можете попробовать долгий путь:
mkdir newrepo.git
cd newrepo.git
git init
git remote add origin file:///path/to/original
git fetch origin branchiwant:refs/remotes/origin/branchiwant
git checkout -b branchiwant --track origin/branchiwant
Что это делает:
- Создайте и запустите пустой Git-репозиторий.
- Добавляет исходный репозиторий в качестве удаленного источника.
- Выбирает только ту ветвь, которая вам требуется от удаленного источника.
- Создает и извлекает новую ветвь, настроенную для отслеживания только что клонированной исходной ветки.
Надеюсь, это будет что-то вроде того, что вы после.
Вы можете сделать это с помощью следующей команды:
git clone -b branch_name --single-branch project_url local_folder_to_clone_in
Из справочной страницы git-clone:
--single-branch
Ваш друг во время клона не забудьте использовать с --branch <branch name>
или будет удалена только основная первичная HEAD (по умолчанию master)
Всегда не забывайте использовать Ctrl + F5 для чтения из свежего источника, а не из кеша:-) (я так давно не знал об этой опции).
Клонировать только одну ветку. Это самый простой способ:
$ git clone -b BRANCH_NAME --single-branch git@bitbucket.org:___/PROJECTNAME.git
git clone --branch <branchname> <remote-repo-url>
или же
git clone -b <branchname> <remote-repo-url>
Здесь есть множество ответов, в которых упоминается:
# (We'll refer to this as "the 1st command" below.)
git clone -b branch_name --single-branch \
https://github.com/some_project/some_project.git
... или какая-то его версия, а также некоторые, в которых упоминается только:
# (We'll refer to this as "the 2nd command" below.)
git clone -b branch_name https://github.com/some_project/some_project.git
...без
--single-branch
часть.
Но я хотел бы немного разъяснить эти две вещи и показать более знакомый набор эквивалентных команд, чтобы мы могли видеть, что происходит с каждым из них.
Предположим, у вас есть удаленное репо на GitHub по адресу https://github.com/micronucleus/micronucleus.git с удаленными ветвями.
master
и
version_2.5
(это реальный пример, который вы можете запустить прямо сейчас).
Разбивка 2-й команды сверху:
2-я команда (git clone -b version_2.5 https://github.com/micronucleus/micronucleus.git
) клонирует ВСЕ УДАЛЕННЫЕ ФИЛИАЛЫ на локальный ПК, но затем проверяет
version_2.5
филиал вместо
master
ветка. Эта одна команда эквивалентна следующему:
git clone https://github.com/micronucleus/micronucleus.git
cd micronucleus # cd into the repo you just cloned
git checkout version_2.5
# To be pedantic, also delete the local `master` branch since
# technically it won't exist yet since you haven't yet checked
# it out with `git checkout master`, which would create it from
# your locally-stored remote-tracking branch, `origin/master`
git branch -d master
В
-b version_2.5
часть автоматически проверила
version_2.5
филиал для нас вместо
master
.
git branch -a
показывает нам, что ВСЕ ветки, однако, были клонированы на наш локальный компьютер. Здесь вы можете увидеть наш местный филиал
version_2.5
, на котором мы работаем, плюс локально сохраненные ветки удаленного отслеживания
origin/HEAD
(что указывает на
origin/master
), плюс
origin/master
, и
origin/version_2.5
:
$ git branch -a
* version_2.5
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/version_2.5
Мы также можем посмотреть, что наши
fetch
ссылки есть. Вы можете открыть
.git/config
файл, чтобы увидеть их напрямую, или просто запустите
git config remote.origin.fetch
:
$ git config remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
Вы можете видеть выше, что наши
git fetch
команда (которая также запускается
git pull
поскольку это эквивалентно
git fetch && git merge
) настроен на выборку ВСЕХ голов для ВСЕХ ветвей в
origin
удаленный. Я не специалист в этой части, но я считаю, что это то, что
+refs/heads/*:refs/remotes/origin/*
средства.
Разбивка 1-й команды сверху:
1-я команда (git clone -b version_2.5 --single-branch https://github.com/micronucleus/micronucleus.git
) клонирует ТОЛЬКО
version_2.5
ветвь на ваш локальный компьютер, и он также проверяет его. Эта одна команда эквивалентна выполнению этого (по крайней мере, в конечном результате, за исключением того, что она также загружает гораздо меньше данных в начале, поскольку она клонирует только ОДНУ ветку, а не все из них):
git clone https://github.com/micronucleus/micronucleus.git
cd micronucleus # cd into the repo you just cloned
git checkout version_2.5
# Delete ALL other branches, including remote-tracking ones, which are not the
# `version_2.5` branch:
# One local branch
git branch -d master
# ALL other locally-stored remote-tracking branches
git branch -dr origin/HEAD
git branch -dr origin/master
# Fix your `.git/config` file so that `git fetch` does the right thing, fetching
# ONLY the `version_2.5` branch head from the `origin/version_2.5` remote branch:
git config remote.origin.fetch \
"+refs/heads/version_2.5:refs/remotes/origin/version_2.5"
В
-b version_2.5
часть вызвала
version_2.5
ветвь для проверки вместо
master
ветвь по умолчанию (как описано выше), а
--single-branch
часть вызвала:
- НИКАКОЙ из других веток, которые нужно клонировать на наш компьютер, и
git fetch
быть настроенным таким образом, что НИКАКАЯ из других ветвей никогда не будет выбрана, когда мы вызываемgit fetch
или жеgit pull
!
Эта команда действительно клонирована и получит только ту ветку, которую мы хотели, и все!
git branch -a
показывает нам, что ТОЛЬКО
version_2.5
ветка была клонирована и проверена. Здесь мы видим
*
какая ветвь проверена, и мы также видим, что у нас есть локально сохраненная ветка удаленного отслеживания для
origin/version_2.5
:
$ git branch -a
* version_2.5
remotes/origin/version_2.5
Мы также можем посмотреть, что наши
fetch
ссылки есть. Вы можете открыть
.git/config
файл, чтобы увидеть их напрямую, или просто запустите
git config remote.origin.fetch
:
$ git config remote.origin.fetch
+refs/heads/version_2.5:refs/remotes/origin/version_2.5
Вы можете видеть выше, что наши
git fetch
команда получит только
version_2.5
глава отделения от
origin/version_2.5
удаленный филиал. Это оно! Помните, что никакие другие удаленные ветки никогда не будут загружены.
Резюме:
Итак, теперь вы видите, что использование
-b branch_name
в основном просто обеспечивает
branch_name
ветка извлекается после клона, но по-прежнему клонирует ВСЕ удаленные ветки, добавляя также
--single-branch
гарантирует, что ТОЛЬКО
branch_name
клонируется, извлекается, извлекается и отслеживается. Никакие другие удаленные ветки не будут клонированы на ваш компьютер вообще.
Лично я предпочитаю
-b branch_name
вариант, потому что я хочу, чтобы все ветки были клонированы на мой локальный компьютер. Единственным исключением может быть огромное общее монорепо, которое имеет десятки, а то и сотни или тысячи удаленных веток. В этом случае просто используйте
-b branch_name --single-branch
клонировать только одну важную ветку, которая вам небезразлична, и готово. Лучше загрузить 50 ГиБ данных для
master
например, в огромном монорепо, чем загружать 200 ГиБ данных, чтобы у вас было 2000 веток ваших коллег, над которыми они тоже работают!
Рекомендации:
🏎️ Некоторые показатели эффективности 🏎️
Я сравнил два из предложенных подходов и обнаружил, что один намного быстрее (и меньше), чем другой (что выгодно, если ваша единственная цель - клонировать, и вам все равно).
Я обнаружил, что наиболее важным показателем эффективности является
time bash -cl "git clone --single-branch --depth=1 --branch=$MYBRANCH $MYGITURL"
Я тестировал это на большом проекте с долгой историей и множеством ветвей, и этот подход занимает около 6 секунд.
Обратите внимание, что, вопреки тому, что утверждается в нескольких комментариях в этой ветке (по крайней мере, в последней версии git), это будет только
Второе место
Для сравнения, Frerich Raabe «s подход последовательно взял 26s:
time bash -cl "git init && git remote add -t $MYBRANCH -f origin $MYGITURL && git checkout $MYBRANCH"
При сравнении этих двух важно также отметить, что в моем случае целевая ветвь является значительно уменьшенной версией своей родительской ветки. Индикатор выполнения загрузки первого подхода отражает это уменьшение в размере (<10 МБ), а второй - нет (> 90 МБ). (Я уверен, что есть более зрелые методы измерения общего размера загрузки, но я еще не изучал их.)
Я сделал это так
git clone -b <branch_name> url
пример :
git clone -b master https://gitlab.com/jhondoe/applicationproject.git
или
git clone -b master git@gitlab.com:jhondoe/applicationproject.git
Для клонирования конкретной ветки вы можете сделать:
git clone --branch yourBranchName git@yourRepository.git
Для клонирования ветки Git, к которой у вас нет открытого ключа, используйте это:
git clone -b <branch> <Git repository URL or clone URL you get from Git repository>
Откройте cmd.
cd folder_name
(введите путь клонирования ветки)
Всего одна команда:
git clone url_of_projecturltoclone -b branch_name
Let us take the example of flask repo. It has 3 branches in addition to master. Let us checkout the 1.1.x remote branch
clone the git repo
git clone https://github.com/pallets/flask
cd into the repo.
cd flask
fetch remote branch 1.1.x
git fetch origin 1.1.x
checkout the branch
git checkout 1.1.x
You will switch to the branch 1.1.x and it will track the remote 1.1.x branch.
Для этого есть в основном 2 решения:
Вам необходимо указать имя ветки с помощью переключателя -b команды. Вот синтаксис команды для клонирования конкретной ветки git.
git clone -b <BRANCH_NAME> <GIT_REMOTE_URL>
Пример:
git clone -b tahir https://github.com/Repository/Project.git
Следующая команда клонирует ветку tahir из репозитория git. Вышеупомянутая команда клонирует только конкретную ветку, но извлекает детали других веток. Вы можете просмотреть все детали веток с помощью команды.
git branch -a
Ты можешь использовать
--single-branch
флаг, чтобы предотвратить получение деталей других веток, как показано ниже:git clone -b <BRANCH_NAME> --single-branch <GIT_REMOTE_URL>
Пример:
git clone -b tahir --single-branch \ https://github.com/Repository/Project.git
Теперь, если вы сделаете
git branch -a
, он покажет только вашу текущую единственную ветвь, которую вы клонировали, а не все ветки. Так что это зависит от вас, как вы этого хотите.
Немного поздно, но я хотел добавить решение, которое использовал для решения этой проблемы. Я нашел решение здесь.
Во всяком случае, вопрос, похоже, заключается в том, "как начать новый проект из ветки другого репо?"
Решением, которое я использовал, было бы сначала создать новое репо в github или где-либо еще. Это будет репо для вашего нового проекта.
На локальном компьютере перейдите к проекту, в котором есть ветка, которую вы хотите использовать в качестве шаблона для вашего нового проекта.
Выполните команду:
git push https://github.com/accountname/new-repo.git +old_branch:master
Это приведет к перемещению old_branch в новое репо и сделает его главной ветвью нового репо.
Затем вам просто нужно клонировать новое репо в локальный каталог вашего нового проекта, и у вас будет новый проект, запущенный в старой ветке.
Вы можете использовать эту команду для git single branch и переименовать папку, если вы хотите сохранить автономную ветвь
git clone -b [branch-name] --single-branch [url] [folder_name]
пример
git clone -b mybranch --single-branch git://github/repository.git project_mybranch
Если вам нужен неглубокий клон, вы можете сделать это с помощью:
git clone -b mybranch --depth=1 https://example.com/myproject.git localname
--depth=1
подразумевает --single-branch
.
Подпишите Github CLI
Если вы клонируете репозиторий с помощью интерфейса командной строки Github, параметры клонирования должны быть объявлены по-другому.
--глубина=1
gh repo clone username/repo -- --depth=1
--одна ветвь
gh repo clone username/repo -- --single-branch
--ветвь
gh repo clone username/repo -- --branch main --single-branch localDir
Это должно работать
git clone --single-branch <branchname> <remote-repo-url>
git clone --branch <branchname> <remote-repo-url>
Можно сделать в 2 этапа
Клонировать хранилище
git clone <http url>
Оформите нужную ветку
git checkout $BranchName
Для таких новичков, как я, просто запустите приведенный ниже код
git clone https://gitlab.com/repo/repo.git --branch <name of branch> --single-branch
Подобно тому, что сказал здесь @nosaiba-darwish: здесь
Вот чем мы обычно занимаемся в нашей компании:
git clone -b <name_of_branch> --single-branch <git_url> folder_to_clone_locally
После того, как клонирование было завершено, я должен был войти git submodule update --init --recursive
скачать все подмодули
git clone --branch {branch-name} {repo-URI}
Пример:
git clone --branch dev https://github.com/ann/cleaningmachine.git
- dev: Это
{branch-name}
- https://github.com/ann/cleaningmachine.git: это
{repo-URI}
- Откройте оболочку Git Bash.
- Создайте каталог в вашей файловой системе, где вы хотите оформить заказ.
- $ mkdir Feature_develop_branch
- Перейдите в папку Feature_develop_branch.
- $ cd Feature_develop_branch
- Клонируйте репозиторий, используя внешний URL-адрес клонирования.
- $ git clone https://someurl.repositoryname.git/
- После клонирования измените каталог на созданное имя репозитория.
- $ cd / repositoryName
- Проверьте ветку.
- $ git checkout
<Branch Name>
- $ git checkout