Как мне клонировать одну ветку в Git?

800

У меня есть локальный репозиторий 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.

Кейси Родармор
источник
Что git branch -aпоказывает?
Якуб Наребски
3
Будет git checkout -b newbranch origin/branchiwantработать лучше? (без --trackопции)
VonC
3
Я думаю, что вы пытаетесь сделать, это плохая идея. Используйте разные репозитории для разных проектов. Филиалы это нечто совершенно другое.
InnaM
@ Манни, я как-то так думал, потому что мерзавцу не нравилось то, что я делаю. Вы можете объяснить, почему? Это потому, что ветви не должны быть долгоживущими?
Кейси Родармор
1
@rodarmor Я думаю, что вы пытаетесь сделать, это хорошая идея, и у меня был именно этот вопрос.
Пол Дю Буа

Ответы:

864

Примечание: 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
'

Тобу комментирует, что:

Это подразумевается при выполнении мелкого клона.
Это делает 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

Как Крис комментирует:

Волшебная линия для --single-branchвозврата недостающих веток (git v2.1.4):

git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
git fetch --unshallow  

В Git 2.26 (Q1 2020) « git clone --recurse-submodules --single-branch» теперь использует ту же опцию для одной ветви при клонировании подмодулей .

См. Коммит 132f600 , коммит 4731957 (21 февраля 2020 г.) Эмили Шаффер ( nasamuffin) .
(Слиты Junio C Hamano - gitster- в фиксации b22db26 , 5 марта 2020)

clone: pass --single-branch во время --recurse-submodules

Подписано: Эмили Шаффер
Автор: Джефф Кинг

Ранее выполнение " git clone --recurse-submodules --single-branch" приводило к клонированию подмодулей всех ветвей, хотя суперпроект клонировал только одну ветвь.

Пропустите --single-branchчерез вспомогательный фреймворк подмодуля, чтобы сделать это cloneпозже.

VonC
источник
80
git clone <url> --branch <branch> --single-branch <folder>работает как шарм.
Александр
1
Да, я думаю, что пришло время обновить принятый ответ :) Это «работает как очарование»
kumarharsh
5
Кроме того, это подразумевается при выполнении мелкого клона. Это делает clone --depth 1самый простой способ сэкономить пропускную способность.
Тобу
1
@Tobu и VonC --depth 1небезопасны для пользователя, потому что они, возможно, захотят использовать push / pull с новым клоном.
ЯМР
2
Просто для того, чтобы излагать исправления Питера Кордеса полностью, волшебная линия для получения недостающих ветвей для обратного --single-branchесть git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*и git fetch --unshallow(git v2.1.4)
Крис
670

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

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
Алекс Ноласко
источник
36
Это работает, но он выбирает все ветви. Смотрите ответ @ frerich = raabe ниже.
cdunn2001
3
Спасибо вам. в моем случае добавьте только "-b branch_name". Это сэкономило мне много времени.
PhatHV
Да, это работает отлично ...! Я больше человек из TFS и для моих личных проектов использую git. Что касается ветвления мерзавцев, я делал это неправильно и хорошо знать этот простой метод, и он кажется идеальным! Еще раз спасибо! Уже + 1, если возможно, я бы дал +100 :)
k25
11
Вы также можете добавить --single-branchдля извлечения только историю, связанную с этой веткой, вместо всех историй и тегов, содержащихся в хранилище.
flawyte
1
@AlexNolasco Можете ли вы отредактировать ответ, указав, что такое папка / some / ? Спасибо
Набин
112

Используя Git версии 1.7.3.1 (в Windows), вот что я делаю ( $BRANCHэто название ветви, которую я хочу оформить, и $REMOTE_REPOURL удаленного репозитория, из которого я хочу клонировать):

mkdir $BRANCH
cd $BRANCH
git init
git remote add -t $BRANCH -f origin $REMOTE_REPO
git checkout $BRANCH

Преимущество этого подхода состоит в том, что последующие git pull(или git fetch) вызовы также просто загружают запрошенную ветку.

Фрерих Раабе
источник
Чем отличается ваш сценарий от этой строки? git clone -b $BRANCH $REMOTE_REPO $BRANCHафик они одинаковые?
Ян Воан
12
@Ian: Одно из отличий заключается в том, git clone -bчто все удаленные ссылки (все удаленные ветки и теги) git branch -aотображаются как показано. С моим сценарием вы просто получаете один реф.
Фрерих Раабе
1
Когда я пробую вышеописанное (скажем, с $ BRANCH = "nick"), я получаю 'fatal: Не удалось найти удаленных ref refs /heads / nick'. Кажется, не работает для меня ...
Ник
3
Обратите внимание, что -t $BRANCHработает даже без -f, который будет доставлен немедленно. Тогда, git fetch originпринес бы, и git checkout $BRANCHустановил бы местное отделение и оформить заказ. Это полезно, когда вам нужно настроить пульт перед загрузкой, например git config remote.origin.uploadpack=/bin/upload-pack.
cdunn2001
1
Поскольку я нахожусь на "старом" корпоративном мерзавце (1.6.0.2), я обязан вышеуказанному решению. У меня была такая же проблема, как у @Nick. Выполнение мерзавца branch -aпоказало origin/$BRANCH. Делая git checkout origin/$BRANCHэто исправлено.
Д-р Джерри
30

Вы можете попробовать долгий путь:

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-репозиторий.
  • Добавляет исходный репозиторий в качестве удаленного источника .
  • Выбирает только ту ветвь, которая вам требуется от удаленного источника .
  • Создает и извлекает новую ветвь, настроенную для отслеживания только что клонированной исходной ветки.

Надеюсь, это будет что-то вроде того, что вы после.

JKP
источник
Аргументы для git remote add поменялись местами, но я не смог заставить оформить заказ. "git checkout origin / rails" дал мне "error: pathspec 'origin / rails' не соответствует ни одному файлу (файлам), известным git". и альтернатива дала мне «роковую: git checkout: обновление путей несовместимо с переключением ветвей».
Кейси Родармор
@rodarmor: исправили удаленную команду git, спасибо. Можете ли вы вставить вывод git branch -r?
JKP
@jkp, на самом деле не git branch -rдает вывода.
Кейси Родармор
@rodarmor: я исправил пример, и это определенно работает (проверено). HTH (вы можете принять его, как только протестируете, как вам нравится;))
jkp
Ключ -b является относительно новым. В прошлый раз, когда я запускал его в
сжатой версии
23

Вы можете сделать это с помощью следующей команды:

git clone -b branch_name --single-branch project_url local_folder_to_clone_in
Носайба Дарвиш
источник
2
Сработало отлично, у меня действительно была проблема в Source Tree клонировать одну ветку, поэтому сделал это вручную
azhar22k
17

Из справочной страницы git-clone :

--single-branchваш друг во время клонирования не забудьте использовать с --branch <branch name>или только удаленный первичный HEAD будет клонирован (мастер по умолчанию)

Всегда не забывайте делать Ctrl+, F5чтобы читать свежий исходник, а не тот, что из кеша :-) (я так давно не знал об этой опции).

Casey
источник
1
git clone <url> --branch <branch> --single-branch <folder>
шридутт котари
17
git clone <url> --branch <branch> --single-branch

Просто введите URL и название филиала.

Jitendra
источник
8

Клонировать только одну ветку. Это самый простой способ:

$ git clone -b BRANCH_NAME --single-branch git@bitbucket.org:___/PROJECTNAME.git
Cubiczx
источник
4

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

git clone --branch yourBranchName git@yourRepository.git

nPcomp
источник
3

Для клонирования ветки Git, к которой у вас нет открытого ключа, используйте это:

git clone -b <branch> <Git repository URL or clone URL you get from Git repository>
Прем С
источник
2

Откройте cmd.

cd folder_name (введите путь клонирования ветки)

Всего одна команда:

git clone url_of_projecturltoclone -b branch_name
DHS
источник
2

Немного поздно, но я хотел добавить решение, которое использовал для решения этой проблемы. Я нашел решение здесь .

Во всяком случае, кажется, что возникает вопрос: «Как начать новый проект из ветки другого репо?»

Для этого я решил создать новое репо в github или где-либо еще. Это послужит репо вашему новому проекту.

На локальном компьютере перейдите к проекту, в котором есть ветвь, которую вы хотите использовать в качестве шаблона для нового проекта.

Запустите команду:

git push https://github.com/accountname/new-repo.git +old_branch:master

Что это сделает, это переместит old_branch в new-repo и сделает его главной веткой нового репо.

Затем вам просто нужно клонировать новый репозиторий в локальный каталог вашего нового проекта, и у вас есть новый проект, запущенный в старой ветке.

Аарон Пеннингтон
источник
2

Давайте возьмем пример колбы репо. Он имеет 3 филиала в дополнение к мастеру. Давайте проверим удаленную ветку 1.1.x

клонировать мерзавец репо

git clone https://github.com/pallets/flask

CD в ​​репо.

cd flask

получить удаленную ветку 1.1.x

git fetch origin 1.1.x

Оформить заказ

git checkout 1.1.x

Вы переключитесь на ветку 1.1.x и она будет отслеживать удаленную ветку 1.1.x.

Чайтанья Вардхан
источник
0

Подобно тому, что @ nosaiba-darwish сказал здесь: здесь

Вот что мы обычно делаем в нашей компании:

git clone -b <name_of_branch> --single-branch <git_url> folder_to_clone_locally

Акиб Имтиаз Харун
источник
0

Если вы хотите мелкий клон, вы можете сделать это с:

git clone -b mybranch --depth=1 https://example.com/myproject.git localname

--depth=1подразумевает --single-branch.

thakis
источник
0

Для этого есть прежде всего 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

  1. Вы можете использовать флаг «--single-branch», чтобы предотвратить выборку деталей других веток, как показано ниже:

git clone -b <BRANCH_NAME> --single-branch <GIT_REMOTE_URL>

Пример: git clone -b tahir --single-branch https://github.com/Repository/Project.git

Теперь, если вы сделаете a git branch -a, он покажет только вашу текущую отдельную ветку, которую вы клонировали, а не все ветви. Так что это зависит от вас, как вы этого хотите.

Надеюсь, это поможет кому-нибудь когда-нибудь !! ...

Tahir77667
источник
0

Вы можете использовать эту команду для git отдельной ветки и переименования папки, если вы хотите оставить ветвь изолированной

git clone -b [branch-name] --single-branch [url]  [folder_name]

пример

git clone -b mybranch --single-branch git://github/repository.git  project_mybranch
Эльбаз
источник
-1

Может быть сделано в 2 шага

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

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

    • git checkout $BranchName
Прамод Сетлур
источник