Git ile belirli bir etiketi indirme


1941

Git deposunun belirli bir etiketini nasıl indirebileceğimi anlamaya çalışıyorum - mevcut sürümün arkasında bir sürüm var.

Git web sayfasında önceki sürüm için bir etiket olduğunu gördüm, nesne adı uzun bir onaltılık sayı.

Ancak sürüm adı Tagged release 1.1.5siteye göre " ".

Böyle bir komut denedim (isimleri değişti):

git clone http://git.abc.net/git/abc.git my_abc

Ve bir şey aldım - bir dizin, bir dizi alt dizin, vb.

Eğer bütün havuz buysa, aradığım sürüme nasıl ulaşabilirim? Değilse, söz konusu sürümü nasıl indirebilirim?


11
Üretimden sonra tamamen farklı bir repo geliştiriyorum, bu yüzden git checkout'u kullanmaya çalıştığımda üretimim herhangi bir etiket bilmiyordu. Çözüm "git pull --tags" kullanmak sonra git checkout kullanmak oldu.
Enterprise Architect

11
"git fetch --tags" çok çalışıyor
John Erck

16
Tüm deponun klonlanmasını ve ardından bir etikete geçmesini önlemek için doğrudan bir clone -b "Tagged release 1.1.5" http://git.abc.net/git/abs.git my_abc. Bu yalnızca aynı adı taşıyan bir şubeniz yoksa işe yarayacaktır (metodolojinize bağlı olarak bu asla gerçekleşmeyebilir).
RedGlyph

3
@RedGlyph Teşekkür deneyeceğim. Yoksa böyle yapabiliriz. git checkout -b new-branch tag-name. Şimdi yeni dalınızı klonlayın. İstediğimiz zaman yeni şubeyi silebiliriz.
kalidasan

Yanıtlar:


2871
$ git clone

size bütün depoyu verecektir.

Klondan sonra, etiketleri listeleyebilir $ git tag -lve ardından belirli bir etiketle ödeme yapabilirsiniz:

$ git checkout tags/<tag_name>

Daha da iyisi, ödeme yapın ve bir şube oluşturun (aksi takdirde etiketin revizyon numarasından sonra adlandırılmış bir dalda olacaksınız):

$ git checkout tags/<tag_name> -b <branch_name>

15
Evet. git bu açıdan yıkımdan farklıdır. Bir svn etiketi temel olarak dosyaları yeni bir klasöre kopyalar, böylece belirli bir grup dosyayı teslim alabilirsiniz, ancak git etiketleri sadece belirli düzeltmelere işaret eder.
dbr

5
Aynı ada sahip bir şubeniz ve bir etiketiniz varsa ne olur? Eğer sadece "git checkout <name>" derseniz "uyarı: refname '<name>' belirsizdir. '<name>'" dalına geçilir - bunun yerine etikete geçmesini nasıl söylersiniz?
MatrixFrog

54
bir ödeme yaparken ve Derek'in de belirttiği gibi, repo bir "kopuk kafa" durumuna girer. bunun yerine -bgit checkout <tag_name> -b <branch_name>
git'e

22
@hellatan Bunu sadece gerçekten bir şube oluşturmak istediğinizde yapmalısınız, ancak çoğu zaman muhtemelen yapmazsınız. "Ayrık kafa" durumunda koşmak size zarar vermez ve sadece git geçmişini kontrol etmek istiyorsanız tam olarak istediğiniz şeydir.
machineghost

4
Git sürümünde 1.8.3.5ve daha yenisinde , deponuzu repo HEAD olarak --branch <tag ref>başlayarak indirmenize izin vermelidir <tag ref>; ile birlikte --depth 1sığ bir etiket ödeme yapacaktır. Bkz. Stackoverflow.com/a/21699307/1695680
ThorSummoner

409
git clone --branch my_abc http://git.abc.net/git/abc.git

Repoyu klonlayacak ve sizi ilgilendiğiniz etikete bırakacaktır.

Git klon durumlarının 1.8.0 belgeleri .

--branch ayrıca etiket alabilir ve HEAD'ı sonuçtaki depoda bu taahhütte ayırabilir.


7
Bu, (en azından şimdi) etiketler için işe yarıyor, ancak ayrılmış bir HEAD durumuna geçiyorsunuz.
mxcl

72
Bilginize: --depth 1Geçerli olmayan taahhütlerin indirilmesini önlemek için de belirtiniz .
Acumenus

4
Bu gerçekten yok değil etiketleriyle çalışmaktadır. Sadece dallar. Düzenleme: Git'in yalnızca yeni sürümleri bunu destekliyor gibi görünüyor.
lzap

Ayrıca, gerekirse iki veya daha fazla etiketin sığ bir klonunu yapmak için .git / config (veya bir şekilde yapılandırabilir) düzenleyebiliriz, eğer gerekirse, sığ bir klonu tam klon, vb.'ye yükseltin.
Sam Watkins

etiketi ile birlikte istediğiniz dalı da belirleyebilirsiniz. git clone --branch my_abc http://git.abc.net/git/abc.git -b qualityKalite gibi btw istediğimiz dalın adıdır.
hazimdikenli

180

Dağıtım için yalnızca belirli bir etiketi kontrol etmek için örneğin:

git clone -b 'v2.0' --single-branch --depth 1 https://github.com/git/git.git

Tam bir depo yerine yalnızca en son koda ilgi duyuyorsanız, uzak bir depodaki kodu kontrol etmenin en hızlı yolu budur. Bu şekilde, 'svn co' komutuna benzer.

Not: Git kılavuzuna göre , --depthbayrağın iletilmesi --single-branchvarsayılan olarak ima edilir.

--depth

Belirtilen taahhüt sayısına bölünmüş bir geçmişe sahip sığ bir klon oluşturun. - Tüm şubelerin ipuçlarına yakın geçmişleri almak için - hiçbir tek dal verilmediği sürece - tek dal. Alt modülleri sığ bir şekilde klonlamak istiyorsanız, --shallow-submodules'ü de geçin.


10
Bu karmaşık olduğuna inanamıyorum. sanırım kimse kodlarının başkaları tarafından kullanılmasını beklemiyor.
Ben

9
@Ben, bu aslında en basit çözüm (tek bir komut gerekli)
Eliran Malka

3
@ Ben bu neden karmaşık? Varsayılandan farklı olarak yapmak istediğiniz birkaç özelliğe sahip özel bir kullanıcı tabanıdır. Tabii ki belirtmeniz gerekiyor. Normal çözüm, dağıtılmış bir vcs'de tüm repoyu kontrol etmek olacaktır .
erikbwork

9
@Ben haklı. git af karmaşık ve yıl önce Linus tarafından yazılmıştır ve nasıl çalıştığını "gerçekten" anlayan tek kişi odur. xkcd.com/1597
RyanNerd

11
--depth nima eder --single-branch. İkisine de ihtiyacınız yok.
Niyaz

98

Ben git uzmanı değilim, ama bunun işe yarayacağını düşünüyorum:

git clone http://git.abc.net/git/abc.git
cd abc
git checkout my_abc 

VEYA

git clone http://git.abc.net/git/abc.git
cd abc
git checkout -b new_branch my_abc

İkinci varyasyon etikete dayalı yeni bir dal oluşturur, bu da 'müstakil KAFA' dan kaçınmanızı sağlar. (git-checkout kılavuzu)

Her git repo, tüm revizyon geçmişini içerir, bu nedenle repoyu klonlamak, en son işleme ve aradığınız etiket de dahil olmak üzere daha önce gelen her şeye erişmenizi sağlar.


4
Teşekkür. git checkout -b b1.5.0 v1.5.0Github Pages'a başarılı bir şekilde göndermek için bir 'gh sayfalar' dalı içindeki bir sürümü kontrol ederken kullanmam gerekiyordu . Yazdığım
Chris Jacob

4
Sana lazım beri (terminal içine yapıştırarak örneğin için) bu tamamen doğru olduğunu sanmıyorum cdiçine abc/bir dal ödeme için önce ilk
Steven Lu

@StevenLu Elbette haklısın. Kes ve yapıştır yerine kavramları arıyordum, ama olabildiğince doğru olabilir. Ekledim cd.
grossvogel

81

Belirli bir etiket veya taahhüt kimliği için bir tar topu indirmek için git arşivini kullanabilirsiniz:

git archive --format=tar --remote=[hostname]:[path to repo] [tag name] > tagged_version.tar

Ayrıca bir etiketin zip arşivini dışa aktarabilirsiniz.

  1. Liste etiketleri:

    git tag
    
    0.0.1
    0.1.0
    
  2. Etiketi dışa aktarma:

    git archive -o /tmp/my-repo-0.1.0.zip --prefix=my-repo-0.1.0/ 0.1.0
    
  3. Notlar:

    • Biçimi belirtmenize gerek yoktur. Çıktı dosya adı ile alınacaktır.
    • Ön ekin belirtilmesi, kodunuzun bir dizine dışa aktarılmasını sağlar (sondaki eğik çizgi eklerseniz).

3
Bu komut alt modüllerle çalışmaz, bkz. Stackoverflow.com/questions/1591387/…
Zitrax

3
Ancak git arşivi de sürüm kontrolünü kaldırır, böylece bir sonraki etikete geçmek için başka bir git ödemesi yapamazsınız.
idbrii

9
Evet sürüm kontrolünü kaybedersiniz ama git arşivinin git klonuna göre kaydedildiği zaman KESİNLİKLE KESİNTİSİZ! +1
MarcH

Bu tek istediğim git archiveşey için çok yakın, tek istediğim tek istediğim halka açık bir repodan indirirken bana bir şifre sormak. Nasıl ssh yerine http kullanmasını sağlayabilirim?
robru

1
Bu fatal: Operation not supported by protocol.ve Unexpected end of command streamhatalarıyla başarısız olur . Alternatif olarak, fatal: The remote end hung up unexpectedlyhatayı da döndürebilir .
Acumenus

52

--single-branchAnahtarı kullanın (Git 1.7.10'dan itibaren mevcuttur) . Sözdizimi:

git clone -b <tag_name> --single-branch <repo_url> [<dest_dir>] 

Örneğin:

git clone -b 'v1.9.5' --single-branch https://github.com/git/git.git git-1.9.5

Avantajı: Git, tam olarak aynı miktarda dosyaya göz atarken nesneleri alır ve yalnızca belirtilen şube / etiket için deltaları çözmelidir! Kaynak veri havuzuna bağlı olarak, bu size çok fazla disk alanı kazandıracaktır. (Artı, çok daha hızlı olacak.)


3
Bu cevabı kim indirdiyse / indirdiyse: Lütfen aşağı oylama için kısa bir açıklama içeren bir yorum bırakın. (Sadece soruyorum, çünkü biraz kafam karıştı. Çünkü afaik, verilen problem için en iyi çözüm. Ve eğer öyle düşünmüyorsanız, nedenini bilmek istiyorum.) Çok teşekkürler.
eyecatchUp

5
Downvotes hakkında çok fazla anlam vermeye çalışmayın .. cevabınız çok iyi, onların downvotes muhtemelen asılsız .. SOF üzerinde hayat ..
javadba

git sürüm 2.22.0.windows.1 üzerinde çalışmadı.
Mahesh

29

önce o uzaktan kumandadaki tüm etiketleri getir

git fetch <remote> 'refs/tags/*:refs/tags/*'

ya da sadece yazın

git fetch <remote>

Ardından mevcut etiketleri kontrol edin

git tag -l

ardından aşağıdaki komutu kullanarak söz konusu etikete geçin

git checkout tags/<tag_name>

Umarım bu size yardımcı olur!


neden ´git tag -l´ kullanmalı ´git tag´ ile aynı olmalıdır?
serup

1
@serup; kullanılabilir etiketleri listelerken git tagetiket eklergit tag -l
Joost Döbken

18

Etiketleriniz linux sortkomutu kullanılarak sıralanabilirse , bunu kullanın:

git tag | sort -n | tail -1

Örneğin. eğer git taggetiri:

v1.0.1
v1.0.2
v1.0.5
v1.0.4

git tag | sort -n | tail -1 çıktı olacak:

v1.0.5

git tag | sort -n | tail -2 | head -1 çıktı olacak:

v1.0.4

(çünkü en son ikinci etiketi istediniz)

etiketi kontrol etmek için önce repoyu klonlayın, ardından şunu yazın:

git checkout v1.0.4

..veya neye ihtiyacınız varsa.


25
Sen v1.0.10 ulaşana kadar ve sonra kötü şeyler olur :)
Laurent Grégoire

10
Etiketlerinizin kronolojik olarak sıralanmasını sağlamak için:git for-each-ref --sort='*authordate' --format='%(tag)' refs/tags
Bob G

En son sürümü otomatik olarak kontrol etmek için bir astargit checkout `git tag | sort -n | tail -1`
weiji14

Bunun sort -Vyerine kullanmak isteyebilirsiniz sort -n. Önceki, mutlaka sayısal olmayan sürümleri, örneğin "1.2.3", doğru şekilde işler. Ayrıca, "0.4.10" un "0.4.2" den sonra "0.4.2" den sonra değil "", "0.4.2" den sonra geldiğini anlar -n.
Mateusz Misiorny

16

Git ödeme belgelerini kontrol ettim, ilginç bir şey ortaya çıktı:

git checkout -b <new_branch_name> <start_point>; burada <start_point> yeni dalın başlatılacağı bir taahhüdün adıdır; Varsayılan olarak HEAD

Dolayısıyla, etiket adından bahsedebiliriz (etiket, bir taahhüdün adından başka bir şey değildir), şöyle deyin:

>> git checkout -b 1.0.2_branch 1.0.2
sonra, bazı dosyaları değiştirin
>> git push --tags

Not: Git'te bir etiketi doğrudan güncelleyemezsiniz (etiket yalnızca bir taahhüt için bir etiket olduğundan), bir şubeyle aynı etiketi ödünç almanız ve ardından taahhütte bulunmanız ve ardından ayrı bir etiket oluşturmanız gerekir.


1
Veya herhangi bir değişiklik yapmayı beklemiyorsanız ve kodun bu etikette nasıl göründüğüne bakmak istiyorsanız, bir şube oluşturmadan etiketi kontrol edebilirsiniz. "Ayrılmış kafa" durumunda olduğunuzu açıklayan bir metin alacaksınız ve dilerseniz daha sonra istediğiniz zaman dal oluşturabilirsiniz.
MatrixFrog

16
git fetch <gitserver> <remotetag>:<localtag>

===================================

Sadece yaptım. Önce etiket adının yazımını bildiğimden emin oldum.

git ls-remote --tags gitserver; : or origin, whatever your remote is called

Bu bana git sunucumdan seçim yapabileceğim bir etiket listesi verdi. Orijinal poster etiketinin adını zaten biliyordu, bu yüzden bu adım herkes için gerekli değil. Gerçek liste daha uzun olmasına rağmen çıktı böyle görünüyordu.

8acb6864d10caa9baf25cc1e4857371efb01f7cd    refs/tags/v5.2.2.2
f4ba9d79e3d760f1990c2117187b5010e92e1ea2    refs/tags/v5.2.3.1
8dd05466201b51fcaf4ca85897347d82fcb29518    refs/tags/Fix_109
9b5087090d9077c10ba22d99d5ce90d8a45c50a3    refs/tags/Fix_110

İstediğim etiketi seçtim ve getirdim ve başka hiçbir şey aşağıdaki gibi değildi.

git fetch gitserver Fix_110

Daha sonra bunu yerel makinemde etiketledim ve etiketime aynı adı verdim.

git tag Fix_110 FETCH_HEAD

Çalıştığım proje büyük olduğundan ve güzel ve temiz bir ortamda gelişmek istediğimden, uzak depoyu başkalarının önerdiği gibi klonlamak istemedim. Bu orijinal sorulara daha yakın olduğunu hissediyorum "Ben bir KATILIM ETIKETI indirmek nasıl anlamaya çalışıyorum" çözüm tüm klonlama öneren çözüm daha. DOS 0.1 kaynak koduna (örneğin) bakmak istiyorsa neden herkesin Windows NT ve Windows 8.1 kaynak kodunun bir kopyasına sahip olması gerektiğini anlamıyorum.

Ayrıca başkalarının önerdiği gibi CHECKOUT kullanmak istemiyordu. Bir şube kontrol vardı ve bunu etkilemek istemiyordu. Niyetim, istediğim yazılımı almaktı, böylece bir şey seçip onu gelişimime ekleyebildim.

Muhtemelen etiketlenen taahhüdün bir kopyası değil, etiketin kendisini getirmenin bir yolu vardır. Alınan taahhüdü kendim etiketlemem gerekiyordu. EDIT: Ah evet, şimdi buldum.

git fetch gitserver Fix_110:Fix_110

İki nokta üst üste işaretini gördüğünüz yerde, bu uzak ad: local-name ve işte etiket adları. Bu, çalışma ağacı vb. Bozmadan çalışır. Sadece kendi kopyasına sahip olmak için uzaktan yerel makineye bir şeyler kopyalamak gibi görünüyor.

git fetch gitserver --dry-run Fix_110:Fix_110

--dry-run seçeneği eklendiğinde, ne istediğinizi doğrulamak istiyorsanız komutun ne yapacağına bir göz atmanızı sağlar. Sanırım basit

git fetch gitserver remotetag:localtag

gerçek cevap.

=

Etiketler hakkında ayrı bir not ... Yeni bir şeye başladığımda genellikle git init'ten sonra boş havuzu etiketliyorum, çünkü

git rebase -i XXXXX 

bir taahhüt gerektirir ve şu soru ortaya çıkar: "ilk yazılım değişikliğinizi içeren değişiklikleri nasıl yeniden temsili edersiniz?" Böylece çalışmaya başladığımda

git init
touch .gitignore
[then add it and commit it, and finally]
git tag EMPTY

yani ilk gerçek değişikliğimden önce bir taahhüt oluştur ve daha sonra kullan

git rebase -i EMPTY 

ilk değişiklik dahil tüm çalışmalarımı yeniden temellendirmek istersem .


8

Peter Johnson'ın cevabından yola çıkarak kendim için güzel bir küçük takma ad oluşturdum:

alias gcolt="git checkout $(git tag | sort -V | tail -1)"

'git checkout latest tag' olarak da bilinir.

Bu, lOranger'ın işaret ettiği gibi durumları uygun şekilde işleyen GNU türüne dayanmaktadır:

v1.0.1
...
v1.0.9
v1.0.10

Mac kullanıyorsanız brew install coreutilsve bunun yerine gsort'u arayın.



5

Etiketleri Kontrol Etme

Bir etiketin işaret ettiği dosyaların sürümlerini görüntülemek istiyorsanız, git kasasını yapabilirsiniz, ancak bu deponuzu bazı kötü yan etkileri olan "müstakil HEAD" durumuna getirir:

$ git checkout 2.0.0
Note: checking out '2.0.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final

$ git checkout 2.0-beta-0.1
Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601... add atlas.json and cover image

"Müstakil HEAD" durumunda, değişiklik yapar ve daha sonra bir taahhüt oluşturursanız, etiket aynı kalır, ancak yeni taahhüdünüz herhangi bir şubeye ait olmaz ve kesin kesin karması dışında erişilemez olur. Bu nedenle, örneğin eski bir sürümdeki bir hatayı düzelttiğinizi varsa, değişiklik yapmanız gerekiyorsa, genellikle bir şube oluşturmak istersiniz:

$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'

Bunu yaparsanız ve bir taahhütte bulunursanız, yeni değişikliklerinizle birlikte ilerleyeceğinden sürüm2 dalınız v2.0.0 etiketinizden biraz farklı olacaktır, bu yüzden dikkatli olun.


4

Bunu github API ile yapmak:

curl -H "Authorization: token %(access_token)s" -sL -o /tmp/repo.tar.gz "http://api.github.com/repos/%(organisation)s/%(repo)s/tarball/%(tag)s" ;\
tar xfz /tmp/repo.tar.gz -C /tmp/repo --strip-components=1 ; \

1
Bu, dallar ve etiketler için çalışır, ancak kendisine karşı bir etiket oluşturulmasını gerektiren master başkanı için çalışmaz. Minho boyutlu versiyonu elde etmek için oldukça zarif bir yol.
J0hnG4lt
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.