Git'te tek bir dalı nasıl klonlayabilirim?


799

Proje iskeletlerini saklamak için kullandığım, 'iskelet' adı verilen yerel bir Git havuzum var. Farklı projeler için birkaç şubesi vardır:

casey@agave [~/Projects/skeleton] git branch
* master
  rails
  c
  c++

Yeni bir proje için ana dalı kontrol etmek istersem, yapabilirim

casey@agave [~/Projects] git clone skeleton new
Initialized empty Git repository in /Users/casey/Projects/new/.git/

ve her şey istediğim gibi. Özellikle, yeni ana dal iskelet ana dalını işaret eder ve temel proje kurulumunda değişiklikler yapmak için itebilir ve çekebilirim.

Ancak işe yaramayan şey, başka bir dalı klonlamak istiyorsam. Sadece istediğim railsdalı, örneğin dalı çekeceğim ve yeni havuzun varsayılan olarak masteriskelet deposunun railsdalına iten ve çektiği bir dalı var .

Bunu yapmanın iyi bir yolu var mı? Ya da, belki Git'in bir şeyleri yapılandırmamı istemesinin yolu bu değil ve kesinlikle buna açıkım. Belki de ana iskelet deposunu izleyen Ruby on Rails iskelet deposu ile birden fazla depoya sahip olmalıyım? Ve Ruby on Rails iskelet deposunu klonlayan her proje.


Ne git branch -agösterir?
Jakub Narębski

3
Daha git checkout -b newbranch origin/branchiwantiyi çalışır mı? ( --trackseçenek olmadan )
VonC

3
Bence yapmaya çalıştığınız şey kötü bir fikir. Farklı projeler için farklı depolar kullanın. Şubeler tamamen farklı bir şey.
innaM

@Manni, sanırım git yaptığımdan hoşlanmıyor gibiydi. Bana nedenini açıklayabilir misin? Şubelerin uzun ömürlü olmaması gerektiğinden mi?
Casey Rodarmor

1
@rodarmor Sanırım ne yapmaya çalıştığınız iyi bir fikir ve tam olarak bu sorum vardı.
Paul Du Bois

Yanıtlar:


863

Not: git1.7.10 (Nisan 2012) aslında sadece bir dalı klonlamanıza izin verir :

# clone only the remote primary HEAD (default: origin/master)
git clone --single-branch

as in:
git clone <url> --branch <branch> --single-branch [<folder>]

Şurada görebilirsiniz t5500-fetch-pack.sh:

test_expect_success 'single branch clone' '
  git clone --single-branch "file://$(pwd)/." singlebranch
'

Tobu şöyle diyor :

Bu, sığ bir klon yaparken örtüktür.
Bu git clone --depth 1bant genişliğinden tasarruf etmenin en kolay yoludur.

Git 1.9.0'dan (Şubat 2014) beri, sığ klonlar veri aktarımını (it / çek) destekler, böylece bu seçenek şimdi daha da yararlıdır.
Daha "nde bakın git clone --depth 1(sığ klon) dışarı yapar daha yararlı? ".


Sığ bir klonun "geri alınması", " Sığ klonun tam klonuna dönüştürülmesi " bölümünde ayrıntılı olarak açıklanmıştır (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

As Chris yorumlarla:

eksik dalları tersine çevirmek için sihirli çizgi --single-branch(git v2.1.4):

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

Git 2.26 (Q1 2020) ile, " git clone --recurse-submodules --single-branch" artık alt modülleri klonlarken aynı tek dal seçeneğini kullanıyor .

Bkz. 132f600 , taahhüt 4731957 (21 Şubat 2020), Emily Shaffer ( nasamuffin) .
(Göre Birleştirilmiş - Junio Cı Hamano gitster- içinde b22db26 tamamlama 2020 Mart 5)

clone: geçiş - submodüller sırasında - tek dal

İmzalayan: Emily Shaffer
Onaylayan: Jeff King

Daha önce, " git clone --recurse-submodules --single-branch" işleminin gerçekleştirilmesi , süper proje yalnızca bir dalı klonlasa da, alt modüllerin tüm dalları klonlamasına yol açtı.

Boru --single-branchsubmodule yardımcı çerçevesi aracılığıyla 'bunu yapmak için clonedaha sonra'.


80
git clone <url> --branch <branch> --single-branch <folder>tıkır tıkır çalışıyor.
Alexander

1
Evet, sanırım kabul edilen cevabı güncelleme zamanı :) Bu "cazibe gibi çalışıyor"
kumarharsh

5
Ayrıca, sığ bir klon yaparken bu örtüktür. Bu clone --depth 1bant genişliğinden tasarruf etmenin en kolay yoludur.
Tobu

1
@Tobu ve VonC --depth 1, kullanıcı için güvenli değildir, çünkü yeni klonla gerçekten itmek / çekmek isteyebilirler.
nmr

2
Sadece tam Peter Cordes' düzeltme telaffuz etmek, tersine çevirmek için şube eksik almak için sihirli hattı --single-brancholduğunu git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*ve git fetch --unshallow(git v2.1.4)
Chris

670

Bunun bir yolu aşağıdakileri uygulamaktır.

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

branch_nameSeçtiğiniz dal nerede ve "/ klasörünüz" bu dalın hedef klasörüdür. Bunun diğer dalları size ileri geri birleştirme fırsatı getireceği doğrudur.

Güncelleme

Şimdi Git 1.7.10 ile başlayarak bunu yapabilirsiniz.

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

36
Bu işe yarar, ancak tüm dalları getirir . Aşağıdaki @ frerich = raabe'nin cevabına bakınız.
cdunn2001

3
Teşekkürler. benim durumuma sadece "-b branch_name" yaz. Bana çok zaman kazandırdı.
PhatHV

Evet mükemmel çalışıyor ...! Ben daha çok bir TFS üyesiyim ve kişisel projelerim için git kullanıyor. Wrto git dallanma, daha önce yanlış bir şekilde yapıyordum ve bu kolay yöntemi bilmek iyi ve mükemmel görünüyor! Tekrar teşekkürler! Zaten + 1'ledi, mümkünse +100 :)
k25

11
Ayrıca --single-branch, deponun içerdiği tüm geçmiş ve etiketler yerine yalnızca bu dalla ilişkilendirilmiş geçmişi getirmeyi de ekleyebilirsiniz .
flawyte

1
@AlexNolasco Lütfen / some / klasörü nedir diyerek cevabı düzenleyebilir misiniz ? Teşekkür ederim
Nabin

112

Git sürüm 1.7.3.1'i (Windows'ta) kullanarak, yaptığım şey ( $BRANCHçıkış yapmak istediğim dalın adı ve $REMOTE_REPOkopyalamak istediğim uzak deponun URL'si):

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

Bu yaklaşımın avantajı, sonraki git pull(veya git fetch) çağrıların da sadece istenen dalı indireceğidir.


Senaryonuz ve bu satır arasındaki fark nedir? git clone -b $BRANCH $REMOTE_REPO $BRANCHafik onlar aynı?
Ian Vaughan

12
@Ian: Bir fark git clone -bsize gösterdiği gibi tüm uzak referansları (tüm uzak dallar ve etiketler) verir git branch -a. Senaryomla, tek bir ref elde edersiniz.
Frerich Raabe

1
Yukarıdakileri denediğimde ($ BRANCH = "nick" ile söyleyin), 'ölümcül: Uzak ref ref / heads / nick' bulunamadı. Benim için çalışmıyor gibi görünüyor ...
Nick

3
Not -t $BRANCHbile olmadan çalışır -fhemen almak istiyorsunuz. Ardından git fetch originalmak istiyorsunuz ve git checkout $BRANCHyerel şube ve ödemeyi kuracak. Bu, getirmeden önce uzaktan kumandayı yapılandırmanız gerektiğinde yararlıdır, örn git config remote.origin.uploadpack=/bin/upload-pack.
cdunn2001

1
"Eski" bir kurumsal git (1.6.0.2) üzerinde olduğum için yukarıdaki çözüme bağlıyım. @Nick ile aynı problemim vardı. Git yürütüldüğünü branch -agösterdi origin/$BRANCH. Bunu git checkout origin/$BRANCHdüzeltmek.
dr jerry

30

Uzun soluklu yolu deneyebilirsiniz:

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

Bunun yaptığı:

  • Boş bir Git deposu oluşturun ve başlatın.
  • Orijinal veri havuzunu, kaynak adı verilen bir uzaktan kumanda olarak ekler .
  • Yalnızca, kaynak adı verilen uzaktan kumandadan istediğiniz dalı alır .
  • Yeni klonladığınız kaynak dalı izlemek için ayarlanmış yeni bir dal oluşturur ve denetler.

Umarım bu peşinde olduğun gibi bir şey olacaktır.


Git remote add argümanları değiştirildi, ancak daha sonra çalışmak için ödeme alamadım. "git checkout origin / rails" bana verdi "hatası: pathspec 'origin / rails' git ile bilinen hiçbir dosyayla eşleşmedi." ve alternatif bana "fatal: git checkout: yolların güncellenmesi dalların değiştirilmesi ile uyumsuz."
Casey Rodarmor

@rodarmor: git remote komutunu düzelttik, teşekkürler. Çıktısını yapıştırabilir misiniz git branch -r?
jkp

@jkp, Aslında git branch -rçıktı vermiyor .
Casey Rodarmor

@rodarmor: Örneği düzelttim ve bu kesinlikle işe yarıyor (test edildi). HTH (istediğiniz gibi test ettikten sonra kabul edebilirsiniz;))
jkp

-b anahtarı nispeten yenidir. En son ben debian bir sıkma üzerinde koştu, mevcut değildi, IIRC
sehe

23

Aşağıdaki komutu kullanarak bunu yapabilirsiniz:

git clone -b branch_name --single-branch project_url local_folder_to_clone_in

2
Mükemmel çalıştı, aslında Kaynak Ağacı'nda tek bir dalı klonlamak için sorun vardı, bu yüzden elle yaptım
azhar22k

17

Gönderen git-klon adam sayfası :

--single-branchklon sırasında arkadaşınız kullanmayı unutmayın --branch <branch name>veya yalnızca uzak birincil KAFA klonlanır (varsayılan olarak ana)

Her zaman önbellekten değil, taze kaynak okumak için Ctrl+ yapmayı unutmayın F5:-) (Bu seçenek hakkında uzun zamandır bilmiyordum.)


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

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

URL ve şube adını girmeniz yeterlidir.


8

Sadece bir dalı klonlayın. Bu en kolay yol:

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

4

Belirli bir dalı klonlamak için şunları yapabilirsiniz:

git clone --branch yourBranchName git@yourRepository.git


3

Git'in ortak anahtarına sahip olmadığınız bir dalı klonlamak için şunu kullanın:

git clone -b <branch> <Git repository URL or clone URL you get from Git repository>

2

Cmd'yi açın.

cd folder_name (dalı klonlayacağınız yolu girin)

Sadece bir komut:

git clone url_of_projecturltoclone -b branch_name

2

Biraz geç ama bu sorunu çözmek için kullandığım çözümü eklemek istedim. Çözümü burada buldum .

Her neyse, soru 'başka bir repo şubesinden yeni bir projeye nasıl başlanacağını' soruyor gibi görünüyor.

Bunun için kullandığım çözüm ilk önce github'da ya da her yerde yeni bir repo yaratmak olacaktır. Bu, yeni projenize bir repo olarak hizmet edecektir.

Yerel makinenizde, yeni projeniz için şablon olarak kullanmak istediğiniz dalı içeren projeye gidin.

Komutu çalıştırın:

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

Bunun yapacağı şey, old_branch'ı yeni repoya itmek ve yeni repo'nun ana dalı yapmak.

Daha sonra yeni repoyu yeni projenizin yerel dizinine kopyalamanız yeterlidir ve eski şubede yeni bir projeniz başlar.


2

Şişe deposu örneğini ele alalım. Ustaya ek olarak 3 şubesi vardır. 1.1.x uzak dalını kontrol edelim

git repo'yu klonla

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

repo içine cd.

cd flask

uzak şube 1.1.x getir

git fetch origin 1.1.x

şubeye göz at

git checkout 1.1.x

1.1.x şubesine geçersiniz ve uzak 1.1.x şubesini izler.


0

@ Nosaiba-darwish'in söylediklerine benzer: burada

Şirketimizde genellikle yaptığımız şey budur:

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


0

Sığ bir klon istiyorsanız, bunu aşağıdakilerle yapabilirsiniz:

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

--depth=1ima eder --single-branch.


0

Bunun için öncelikle 2 çözüm vardır:

  1. Şube adını -b komut anahtarıyla belirtmeniz gerekir. İşte belirli git dalını klonlama komutunun sözdizimi.

git clone -b <BRANCH_NAME> <GIT_REMOTE_URL>

Örnek: git clone -b tahir https://github.com/Repository/Project.git

Aşağıdaki komut , git deposundan şube tahirini klonlayacaktır. Yukarıdaki komut sadece belirli dalı klonlar, ancak diğer dalların ayrıntılarını getirir. Tüm şube detaylarını komutla görüntüleyebilirsiniz. git branch -a

  1. Aşağıdaki gibi diğer dalların ayrıntılarının getirilmesini önlemek için '--single-branch' bayrağını kullanabilirsiniz:

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

Örnek: git clone -b tahir --single-branch https://github.com/Repository/Project.git

Şimdi bir yaparsanız git branch -a, sadece mevcut tek dalınızı klonladığınızı gösterir, tüm dalları değil.

Umarım bir gün birine yardım eder !! ...


0

dallı tek başına tutmak istiyorsanız, tek bir dalı git ve klasörü yeniden adlandırmak için bu komutu kullanabilirsiniz

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

misal

git clone -b mybranch --single-branch git://github/repository.git  project_mybranch


-1

2 adımda yapılabilir

  1. Depoyu klonlayın

    • git clone <http url>
  2. İstediğiniz şubeye göz atın

    • git checkout $BranchName
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.