Як клонувати одну гілку в Git?


799

У мене є локальне сховище Git під назвою "скелет", яке я використовую для зберігання скелетів проектів. У ньому є кілька відділень для різних проектів:

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

@Manni, я так думав, оскільки git, здавалося, не подобається тому, що я роблю. Чи можете ви пояснити, чому? Це тому, що гілки не повинні довго жити?
Кейсі Родармор

1
@rodarmor Я думаю, що те, що ти намагаєшся зробити там, є гарна ідея, і у мене було саме це питання.
Пол Дю Буа

Відповіді:


863

Примітка: 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) .
(Об’єднав Хуніо С Хамано - gitster- у комітеті b22db26 , 05 березня 2020 р.)

clone: пройти --один-гілка під час --рекурсу-підмодулі

Підписаний: Емілі Шаффер
Акцентований: Джефф Кінг

Раніше виконання " git clone --recurse-submodules --single-branch" призводило до того, що підмодулі клонували всі гілки, хоча суперпроект клонував лише одну гілку.

Проведіть трубу --single-branchчерез допоміжну рамку підмодуля, щоб потім зробити це ' clone'.


80
git clone <url> --branch <branch> --single-branch <folder>працює як шарм.
Олександр

1
Так, я думаю, що пора оновити прийняту відповідь :) Це "працює як принадність"
kumarharsh

5
Також це мається на увазі, коли робиться дрібний клон. Це робить clone --depth 1найпростішим способом збереження пропускної здатності.
Тобу

1
@Tobu і VonC --depth 1небезпечні для користувача, оскільки вони можуть захотіти реально натиснути / потягнути з новим клоном.
nmr

2
Просто прописати корекції Пітера Корд в повному обсязі, чарівна лінія для отримання відсутні філії скасувати --single-branchце git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*і git fetch --unshallow(мерзотник v2.1.4)
Chris

670

Один із способів - виконати наступне.

git clone user@git-server:project_name.git -b branch_name /your/folder

Де обрана branch_nameгалузь та "/ ваша / папка" - папка призначення для цієї гілки. Це правда, що це призведе до інших галузей, що дасть вам можливість зливатися вперед і назад.

Оновлення

Тепер, починаючи з 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 гілка_назви". Це врятувало мені багато часу.
PhatHV

Так, це прекрасно працює ...! Я більше людина з TFS і для своїх особистих проектів використовую git. Wrto git розгалуження, я робив це неправильно раніше, і добре знати цей простий метод, і це здається ідеальним! Знову дякую! Вже поставив +1, якщо можливо, я б дав +100 :)
k25

11
Ви також можете додати --single-branchлише історію, пов'язану з цією гілкою, а не всю історію та теги, які містить сховище.
flawyte

1
@AlexNolasco Чи можете ви, будь ласка, відредагувати відповідь із записом що таке / дещо / папка ? Дякую
Nabin

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 $BRANCHafik вони однакові?
Ian Vaughan

12
@Ian: Одна відмінність полягає в тому, що git clone -bви отримуєте всі віддалені відгуки (усі віддалені гілки та теги) як git branch -aшоу. З моїм сценарієм ви отримуєте лише одну реферат.
Фріріх Раабе

1
Коли я намагаюся сказати вище (скажімо, з $ BRANCH = "нік"), я отримую "фатально: Не вдалося знайти віддалені ref refs / heads / nick". Здається, це не працює для мене ...
Нік

3
Зауважте, що -t $BRANCHпрацює навіть без цього -f, що отримає негайно. Тоді ми git fetch originвзяли б і git checkout $BRANCHстворили місцеве відділення та касу. Це корисно, коли вам потрібно налаштувати пульт перед завантаженням, наприклад git config remote.origin.uploadpack=/bin/upload-pack.
cdunn2001

1
Оскільки я переживаю "старий" корпоративний git (1.6.0.2), я зв'язаний з вищезазначеним рішенням. У мене була така ж проблема, як у @Nick. Виконання git 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.
  • Додає оригінальний сховище як віддалене джерело, що називається .
  • Вилучає лише потрібну вам гілку з віддаленого походження .
  • Створює та перевіряє нову гілку, створену для відстеження вихідної гілки, яку ви щойно клонували.

Сподіваємось, це стане чимось на кшталт того, що ви хочете.


Аргументи git remote add поміняються, але я не міг змусити замовити роботу. "походження / рейки git checkout" дало мені "помилку: 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>або лише віддаленою первинною головою буде клоновано (майстер за замовчуванням)

Завжди пам'ятайте робити Ctrl+ F5читати свіже джерело, а не те, що з кешу :-) (я не знав про цю опцію давно.)


1
git clone <url> --branch <branch> --single-branch <folder>
shridutt kothari

17
git clone <url> --branch <branch> --single-branch

Просто введіть URL-адресу та назву філії.


8

Клоніруйте лише одну гілку. Це найпростіший спосіб:

$ git clone -b BRANCH_NAME --single-branch git@bitbucket.org:___/PROJECTNAME.git

4

Для клонування конкретної гілки ви можете:

git clone --branch yourBranchName git@yourRepository.git


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

2

Трохи пізно, але я хотів додати рішення, яке використовував для вирішення цієї проблеми. Я знайшов рішення тут .

У будь-якому випадку, схоже, виникає запитання: «як почати новий проект з філії іншого репо?».

Для цього рішенням, яким я користувався, було б спочатку створити нове репо в github або де-небудь коли-небудь. Це послужить репо для вашого нового проекту.

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

Виконайте команду:

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

Це буде робити - підштовхнути old_branch до new-repo і зробити його головним відділенням нового репо.

Тоді вам просто потрібно клонувати нове репо до локального каталогу вашого нового проекту, і у вас є новий проект, запущений у старій гілці.


2

Візьмемо для прикладу колбу репо. Окрім майстра, у нього є 3 відділення. Перевірте віддалену гілку 1.1.x

клонують git repo

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.


0

Для цього є в основному два рішення:

  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

Тепер, якщо ви зробите це git branch -a, воно покаже лише вашій поточній одній гілці, що ви клонували, а не всі гілки. Отже, від вас залежить, як ви цього хочете.

Сподіваюся, це допоможе комусь колись !! ...


0

Ви можете використовувати цю команду для наведення однієї гілки та перейменування папки, якщо Ви хочете залишатись розгалуженою окремо

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.