Как мне клонировать одну ветку в 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 часть вызвала:

  1. НИКАКОЙ из других веток, которые нужно клонировать на наш компьютер, и
  2. 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 веток ваших коллег, над которыми они тоже работают!

Рекомендации:

  1. Клонировать только одну ветку
  2. Как перестать отслеживать удаленную ветку в Git?

🏎️ Некоторые показатели эффективности 🏎️

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

Я обнаружил, что наиболее важным показателем эффективности является Это означает , что VonC «s ответ является самым быстрым. Попробуй сам:

      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>
      git clone --single-branch -b [branch name]  [repository URL]

Откройте 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 решения:

  1. Вам необходимо указать имя ветки с помощью переключателя -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
    
  2. Ты можешь использовать --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 этапа

  1. Клонировать хранилище

    • git clone <http url>
  2. Оформите нужную ветку

    • 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
  1. Откройте оболочку Git Bash.
  2. Создайте каталог в вашей файловой системе, где вы хотите оформить заказ.
    • $ mkdir Feature_develop_branch
  3. Перейдите в папку Feature_develop_branch.
    • $ cd Feature_develop_branch
  4. Клонируйте репозиторий, используя внешний URL-адрес клонирования.
  5. После клонирования измените каталог на созданное имя репозитория.
    • $ cd / repositoryName
  6. Проверьте ветку.
    • $ git checkout <Branch Name>
Другие вопросы по тегам