Soru Git ile belirli bir etiketi indirin


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

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

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

Bunun gibi bir komutu denedim (isimleri değişti):

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

Ve bir şey aldım - bir dizin, bir grup alt dizin, vs.

Tüm depoysa, aradığım versiyona nasıl ulaşırım? Değilse, söz konusu sürümü nasıl indiririm?


1661
2018-04-27 01:15


Menşei


Üretimden sonra tamamen farklı bir repo geliştirdim, bu yüzden git checkout'u kullanmaya çalıştığımda üretimim hiçbir etiket bilmiyordu. Çözüm, "git pull --tags" işlevini kullanmaktı ve git checkout'u kullanacaktı. - Enterprise Architect
"git getiri --tags" da çalışıyor - John Erck
Tüm deponun klonlanmasını önlemek için bir etikete geçiş yapmak için doğrudan clone -b "Tagged release 1.1.5" http://git.abc.net/git/abs.git my_abc. Bu sadece aynı adı taşıyan bir dalınız yoksa çalışır (metodolojinize bağlı olarak, bu asla gerçekleşmeyebilir). - RedGlyph
@RedGlyph Teşekkürler, deneyeceğim. Else bunu yapabiliriz. git checkout -b new-branch tag-name. Şimdi yeni şubeni klonla. İstediğimiz zaman yeni şubeyi silebiliriz. - kalidasan


Cevaplar:


$ git clone

size bütün depoyu verecektir.

Klondan sonra, etiketlerin listesini $ git tag -l ve ardından belirli bir etiketi kontrol edin:

$ git checkout tags/<tag_name>

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

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

2559
2018-04-27 01:53



Evet. git bu açıdan yıkımdan farklıdır. Bir svn etiketi temelde dosyaları yeni bir klasöre kopyalar, böylece belirli bir dosya grubunu kontrol edebilirsiniz, oysa git etiketleri sadece belirli düzeltmeler için işaretçilerdir. - dbr
Bir dalınız ve aynı ada sahip bir etiketiniz varsa ne olur? Eğer "git checkout <name>" yazıyorsanız, "uyarı: refname" <name> 'belirsizdir. Şube' <name> '' 'e geçtiniz - bunun yerine tag' e geçmesini nasıl söylüyorsunuz? - MatrixFrog
MatrixFrog, belirsizliği önlemek için, koş git checkout tags/<name>. Aksi takdirde Git, şubeyi almayı düşündüğünüzü varsayar <name>. - Derek Mahar
Bir ödeme yaparken ve Derek'in bahsettiği gibi, repo “müstakil bir kafa” durumuna giriyor. bunun yerine -b bayrak yeni bir şube oluşturmak ve bir şube adı belirtmek için söyleyerek: git checkout <tag_name> -b <branch_name> - hellatan
@hellatan Sadece bir dal oluşturmak istediğinizde bunu yapmalısınız, ancak çoğu zaman bunu yapmazsınız. "Ayrılmış kafa" devletinde koşmak seni incitmeyecek ve muhtemelen git geçmişini kontrol etmek istiyorsan tam olarak istediğin şey. - machineghost


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

Repo'yu klonlayacak ve ilginizi çeken etikette bırakacak.

1.8.0 belgeleri git klonu devletler.

--branch da etiket alabilir ve sonuçta oluşan depoda bu işlemdeki HEAD'ı çıkartabilir.


269
2018-06-14 09:33



Bu, (en azından şimdi) etiketler için çalışır, ancak müstakil HEAD durumunda kalırsınız. - mxcl
FYI: Ayrıca belirtin --depth 1 herhangi bir mevcut olmayan taahhütleri indirmekten kaçınmak için. - A-B-B
Bu gerçekten yapar değil etiketlerle çalış. Sadece dallar. Düzenleme: Git'in yalnızca daha yeni sürümlerini desteklediği görülüyor. - lzap
Ayrıca, iki veya daha fazla etiketin sığ bir klonunu yapmak için .git / config (veya bir şekilde yapılandırabiliriz) düzenleyebiliriz, eğer gerekliyse, tam bir klona sığ bir klonu yükseltebiliriz. - Sam Watkins
bu kabul edilen cevap olmalı, IMHO. - Sumi Straessle


Git uzmanı değilim, ama bence bu işe yarayacak:

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 dayanan yeni bir şube kurar ve bu da 'bağımsız HEAD'den kaçınmanıza izin verir. (git-checkout manuel)

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


94
2018-04-27 01:54



Teşekkürler. Kullanmam gerekti git checkout -b b1.5.0 v1.5.0 Github Sayfalarına başarılı bir şekilde basmak için bir 'gh-sayfaları' şubesindeki bir sürümü kontrol ederken. Yazdığım bu Gist, başkalarına yardımcı olabilir: branch / tag / submodules ... gist.github.com/1064750 - Chris Jacob
Bunun tam olarak doğru olduğunu sanmıyorum (örneğin, terminale yapıştırmak için) çünkü cd içine abc/ önce bir şube ödeme yapabilirsiniz - Steven Lu
@StevenLu Tabii ki haklısın. Kes ve yapıştır yerine konseptler için gidiyordum, ama olabildiğince doğru olabiliyordu. Ekledim cd. - grossvogel


Dağıtım için yalnızca belirli bir etiketi incelemek için kullanıyorum:

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

Bu, tek bir depo yerine yalnızca en son kodla ilgilenen tek bir uzak depodan kodu denetlemenin en hızlı yolu gibi görünüyor. Bu şekilde, 'svn co' komutunu andırır.


85
2017-07-28 02:35



bunun karmaşık olduğuna inanamıyorum. Kimsenin kodlarının başkaları tarafından kullanılmasını beklemediğini tahmin et. - Ben
@Ben, bu aslında en basit çözümdür (tek bir komut gereklidir) - Eliran Malka
@Ben bu neden karmaşık? Varsayılandan farklı bir şekilde yapmak istediğiniz birkaç özelliğe sahip özel bir kullanım tablosu. Tabi ki bunu belirtmelisin. Normal çözüm, tüm repo'yu dağıtılmış vcs. - erikbwork
@Ben haklı. git karmaşıktır ve YIL önce, Linus tarafından yazılmıştır ve o, nasıl çalıştığını "gerçekten" anlayan tek kişidir. xkcd.com/1597 - RyanNerd


Belirli bir etiket için bir tar topunu indirmek veya id kimliğini uygulamak için git arşivi kullanabilirsiniz:

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

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

  1. Liste etiketleri:

    git tag
    
    0.0.1
    0.1.0
    
  2. Bir etiketi dışa aktar:

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

    • Biçimi belirtmeniz gerekmez. Çıkış dosya adı tarafından alınacaktır.
    • Önek belirtmek, kodunuzu bir dizine dışa aktarır (bir eğik çizgi eklerseniz).

71
2017-12-09 21:46



Bu komut alt modüller ile çalışmaz, bkz. stackoverflow.com/questions/1591387/... - Zitrax
Ancak git arşivi de sürüm kontrolünü kaldırır, böylece bir sonraki etikete yükseltmek için bir kez daha git checkout yapamazsınız. - idbrii
Evet, sürüm denetimini kaybedersiniz, ancak git clone'a kıyasla git arşiviyle karşılaştırıldığında kaydedilen süre KESİNLİKLE BELİRSİZ DEĞİLDİR! +1 - MarcH
İstediğim şeye bu kadar yakın. git archive tek yapmak istediğim bir paroladan indirmek istediğimde parola soruyor. Ssh yerine http'u nasıl kullanabilirim? - robru
Bu ile başarısız fatal: Operation not supported by protocol. ve Unexpected end of command stream hatalar. Alternatif olarak, aynı zamanda fatal: The remote end hung up unexpectedly hata. - A-B-B


Kullan --single-branch şalter  (Git 1.7.10 itibariyle mevcut). Sözdizimi şöyledir:

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

Yarar: Git nesneleri alır ve sadece belirtilen dal / etiket için deltaları çözer (aynı dosyaya bakarken). Kaynak depoya bağlı olarak, bu size çok fazla disk alanı kazandıracaktır. (Artı, çok daha hızlı olacak.)


40
2018-06-25 06:28



Bu yanıtı kandıran / düşüren kişi: Lütfen aşağı çekilmeyle ilgili kısa bir açıklama içeren bir yorum bırakın. (Sadece soruyorum, çünkü biraz kafam karıştı. Çünkü, afaik, bu, verilen problem için en iyi çözüm. Ve eğer öyle düşünmüyorsanız, nedenini bilmek isterim.) Çok teşekkürler. - eyecatchUp
Downvotes çok fazla hissetmeye çalışmayın .. Cevabınız çok iyidir, onların downvotes muhtemelen asılsız .. Bu SOF üzerinde yaşam .. - javadba


ilk önce bu belirli uzaktan kumandadaki tüm etiketleri getir

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

veya sadece yaz

git fetch <remote>

Sonra mevcut etiketleri kontrol edin

git tag -l

daha sonra aşağıdaki komutu kullanarak söz konusu etikete geçin

git checkout tags/<tag_name>

Umarım bu size yardımcı olur!


21
2017-09-10 18:57





Kontrol ettim git çıkış belgesiilginç bir şey ortaya çıkardı:

git checkout -b <new_branch_name> <start_point>   <start_point>, bir işlemin adıdır   Yeni şubeye başlamak için;   HEAD’a Varsayılanlar

Bu nedenle, etiket adından da bahsedebiliriz (çünkü etiket bir şeyden başka bir şey değildir).

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

P.S: Git'te, bir etiketi doğrudan güncelleyemezsiniz (etiket yalnızca bir gönderim için bir etiket olduğu için), aynı etiketi bir dal olarak kontrol etmeniz ve daha sonra buna taahhüt etmeniz ve ardından ayrı bir etiket oluşturmanız gerekir.


14
2018-04-26 14:39



Ya da herhangi bir değişiklik yapmayı beklemiyorsanız ve kodun o etikette neye benzediğine bakmak istiyorsanız, bir şube oluşturmadan etiketi kontrol edebilirsiniz. "Ayrılmış kafa" durumunda olduğunuzu açıklayan bir metin alacaksınız ve isterseniz şubeyi daha sonra oluşturabilirsiniz. - MatrixFrog


Etiketleriniz linux kullanılarak sıralanabilirse sort komutunu kullan, şunu kullan:

git tag | sort -n | tail -1

Örneğin. Eğer git tag döner:

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 sordunuz)

etiketi kontrol etmek için önce repo'yu klonlayın, sonra şunu yazın:

git checkout v1.0.4

..ya ihtiyacınız olan herhangi bir etiket.


14
2018-05-12 12:23



V1.0.10'a ulaşıncaya kadar kötü şeyler olur :) - Laurent Grégoire
Etiketlerinizi kronolojik olarak sıralamak 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 tek liner, git checkout `git tag | sort -n | tail -1` - weiji14
Kullanmak isteyebilirsiniz sort -V yerine sort -n. Önceki, zorunlu olarak sayısal olmayan, ör. "1.2.3". Ayrıca "0.4.10" un "0.4.1" den sonra gittiğini ve "0.4.2" den sonra olmadığını da anlar. -n sana vereceğim. - Mateusz Misiorny


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

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

Bunu daha yeni yaptım. İlk olarak, etiket adı yazımını bildiğimden emin oldum.

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

Bu bana seçmek için git sunucusunda etiketlerin bir listesini verdi. Orijinal poster, etiketinin adını zaten biliyordu, bu nedenle 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 onu getirdim ve hiçbir şey daha fazla değil.

git fetch gitserver Fix_110

Bunu yerel makinemde etiketledim ve etiketimi aynı adama ekledim.

git tag Fix_110 FETCH_HEAD

Çalıştığım proje geniş ve güzel ve temiz bir ortamda geliştirmek istediğim için, diğer insanların yaptığı gibi, uzak depoyu klonlamak istemedim. Bunun orijinal sorulara daha yakın olduğunu hissediyorum. "Bir PARTICULAR TAG'ı nasıl indireceğimi anlamaya çalışıyorum", tüm deponun klonlanmasını öneren çözümden daha iyi. DOS 0.1 kaynak koduna (örneğin) bakmak isteyen herkesin neden 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 istemedim. Bir şubeyi kontrol ettim ve bunu etkilemek istemedim. Amacım istediğim yazılımı almaktı, böylece bir şeyleri alıp gelişime eklemek istedim.

Etiketin işlenmesinin yalnızca bir kopyasını değil, etiketin kendisini almanın bir yolu vardır. Getirilen işi kendim etiketlemeliydim. EDIT: Ah evet, şimdi buldum.

git fetch gitserver Fix_110:Fix_110

Koloniyi gördüğünüz yerde, bu uzak ad: yerel ad ve burada etiket adları. Bu çalışma ağacını üzmeksizin çalışır. Sadece kendi kopyasına sahip olabilmek için uzaktan kumandadan yerel makineye bir şeyler kopyalar.

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 atabilirsiniz. Yani sanırım basit

git fetch gitserver remotetag:localtag

gerçek cevaptır.

=

Etiketlerle ilgili ayrı bir not ... Yeni bir şey başlattığımda, genellikle boşta olan depoyu git init'ten sonra etiketliyorum.

git rebase -i XXXXX 

bir taahhüt gerektirir ve soru "ilk yazılım değişikliğinizi içeren değişiklikleri nasıl geri yüklersiniz?" Yani çalışmaya başladığımda yaparım

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

ilk gerçek değişikliğimden önce bir taahhüt yaratın ve daha sonra kullanın

git rebase -i EMPTY 

eğer tüm işlerimi yeniden inşa etmek istersem, ilk değişiklik dahil.


13
2017-12-11 17:28





Peter Johnson'ın çalışmasıyla, kendim için güzel bir takma ad oluşturdum:

alias gcolt="git checkout \`git tag | sort -V | tail -1\`"

aka 'git checkout son etiketi'.

Bu, bir lOranger'ın işaret ettiği durumları uygun şekilde ele alan GNU sürümüne dayanır:

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

Eğer bir Mac’te brew install coreutils ve bunun yerine gsort'u arayın.


7
2018-03-15 16:41