Unduh tag tertentu dengan Git

1941

Saya mencoba mencari tahu bagaimana saya bisa mengunduh tag tertentu dari repositori Git - ini satu versi di belakang versi saat ini.

Saya melihat ada tag untuk versi sebelumnya di halaman web git, dengan nama objek dari nomor hex panjang.

Tetapi nama versi " Tagged release 1.1.5" sesuai dengan situs.

Saya mencoba perintah seperti ini (dengan nama diubah):

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

Dan saya memang mendapatkan sesuatu - direktori, banyak subdirektori, dll.

Jika seluruh repositori, bagaimana cara mendapatkan versi yang saya cari? Jika tidak, bagaimana cara saya mengunduh versi itu?

Jack BeNimble
sumber
11
Saya mengembangkan repo yang sama sekali berbeda dari produksi, jadi produksi saya tidak tahu tag ketika saya mencoba menggunakan checkout git. Solusinya adalah menggunakan "git pull --tags" lalu gunakan git checkout.
Arsitek Perusahaan
11
"git fetch --tags" juga berfungsi
John Erck
16
Untuk menghindari kloning seluruh repositori kemudian beralih ke tag, Anda bisa langsung melakukan a clone -b "Tagged release 1.1.5" http://git.abc.net/git/abs.git my_abc. Ini hanya akan berfungsi jika Anda tidak memiliki cabang dengan nama yang sama tentunya (tergantung pada metodologi Anda, ini mungkin tidak pernah terjadi).
RedGlyph
3
@RedGlyph Terima kasih saya akan mencobanya. Lain yang bisa kita lakukan seperti ini. git checkout -b new-branch tag-name. Sekarang klon cabang baru Anda. Kapan pun kami mau, kami dapat menghapus cabang baru.
kalidasan

Jawaban:

2871
$ git clone

akan memberi Anda seluruh repositori.

Setelah klon, Anda dapat mencantumkan tag dengan $ git tag -ldan kemudian checkout tag tertentu:

$ git checkout tags/<tag_name>

Lebih baik lagi, checkout dan buat cabang (jika tidak, Anda akan berada di cabang yang dinamai dengan nomor revisi tag):

$ git checkout tags/<tag_name> -b <branch_name>
Besen
sumber
15
Ya. git berbeda dengan subversi dalam hal ini. Tag svn pada dasarnya menyalin file ke folder baru, sehingga Anda dapat melakukan checkout sekelompok file tertentu, sedangkan tag git hanyalah petunjuk untuk revisi tertentu.
dbr
5
Bagaimana jika Anda memiliki cabang dan tag yang memiliki nama yang sama? Jika Anda hanya mengatakan "git checkout <name>" ia mengatakan "peringatan: refname '<name>' ambigu. Beralih ke cabang '<name>'" - bagaimana Anda mengatakannya untuk beralih ke tag?
MatrixFrog
54
ketika melakukan checkout dan seperti yang disebutkan Derek, repo masuk ke kondisi "kepala terpisah". sebagai gantinya, tambahkan -bflag jitu untuk membuat cabang baru dan tentukan nama cabang:git checkout <tag_name> -b <branch_name>
hellatan
22
@ Halo Anda seharusnya hanya melakukan itu ketika Anda benar-benar ingin membuat cabang, tetapi sebagian besar waktu Anda mungkin tidak. Berlari dalam keadaan "kepala terpisah" tidak akan menyakiti Anda, dan kemungkinan persis apa yang Anda inginkan jika Anda hanya ingin memeriksa beberapa riwayat git.
machineghost
4
Dalam versi git 1.8.3.5dan yang lebih baru, --branch <tag ref>seharusnya memungkinkan Anda untuk mengunduh repositori mulai dari <tag ref>sebagai HEAD repo; dikombinasikan dengan --depth 1akan melakukan checkout tag dangkal. Lihat stackoverflow.com/a/21699307/1695680
ThorSummoner
410
git clone --branch my_abc http://git.abc.net/git/abc.git

Akan mengkloning repo dan meninggalkan Anda pada tag yang Anda minati.

Dokumentasi untuk 1.8.0 status klon git .

- cabang juga dapat mengambil tag dan melepaskan KEPALA pada komit di repositori yang dihasilkan.

Toni
sumber
7
Ini (setidaknya sekarang) berfungsi untuk tag, meskipun Anda berakhir dalam keadaan HEAD terpisah.
mxcl
72
FYI: Tentukan juga --depth 1untuk menghindari pengunduhan komitmen tidak lancar.
Acumenus
4
Ini memang tidak bekerja dengan tag. Hanya cabang. Sunting: Sepertinya hanya versi git yang lebih baru mendukungnya.
lzap
Kita juga dapat mengedit .git / config (atau entah bagaimana mengkonfigurasinya) untuk melakukan klon dangkal dari dua atau lebih tag, jika itu mungkin diperlukan, meningkatkan klon dangkal menjadi klon penuh, dll.
Sam Watkins
Anda juga dapat menentukan cabang yang Anda inginkan bersama dengan tag. Suka git clone --branch my_abc http://git.abc.net/git/abc.git -b qualitykualitas adalah nama cabang yang kita inginkan btw.
hazimdikenli
180

Untuk memeriksa hanya tag yang diberikan untuk penerapan, saya menggunakan misalnya:

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

Ini tampaknya menjadi cara tercepat untuk memeriksa kode dari repositori jarak jauh jika seseorang hanya tertarik pada kode terbaru daripada dalam repositori lengkap. Dengan cara ini, ini menyerupai perintah 'svn co'.

Catatan: Per manual Git , melewati --depthflag secara tidak langsung berarti --single-branch.

--kedalaman

Buat klon dangkal dengan riwayat terpotong ke jumlah komit yang ditentukan. Menyiratkan --single-branch kecuali --no-single-branch diberikan untuk mengambil sejarah di dekat ujung semua cabang. Jika Anda ingin mengkloning submodula secara dangkal, sampaikan juga --shallow-submodules.

Yuan HOng
sumber
10
tidak percaya ini rumit ini. kira tidak ada yang mengharapkan kode mereka digunakan oleh orang lain.
Ben
9
@ Ben, ini sebenarnya solusi paling sederhana (diperlukan satu perintah)
Eliran Malka
3
@ Ben mengapa ini rumit? Ini adalah usecase khusus dengan beberapa fitur yang ingin Anda lakukan secara berbeda dari default. Tentu saja Anda perlu menentukannya. Solusi normal adalah dengan checkout seluruh repo dalam vcs terdistribusi .
erikbwork
9
@ Ben benar. git rumit dan ditulis TAHUN yang lalu oleh Linus dan dia satu-satunya yang "benar-benar" mengerti cara kerjanya. xkcd.com/1597
RyanNerd
11
--depth ntersirat --single-branch. Anda tidak perlu keduanya.
Niyaz
98

Saya bukan ahli git, tapi saya pikir ini harus bekerja:

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

ATAU

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

Variasi kedua membuat cabang baru berdasarkan tag, yang memungkinkan Anda menghindari 'HEAD terlepas'. (manual git-checkout)

Setiap git repo berisi seluruh riwayat revisi, jadi kloning repo memberi Anda akses ke komit terbaru, ditambah semua yang datang sebelumnya, termasuk tag yang Anda cari.

grossvogel
sumber
4
Terima kasih. Saya perlu menggunakannya git checkout -b b1.5.0 v1.5.0saat memeriksa versi dalam cabang 'gh-pages' untuk berhasil mendorong ke Halaman Github. Intisari yang saya tulis mungkin dapat membantu orang lain untuk kembali: branch / tag / submodules ... gist.github.com/1064750
Chris Jacob
4
Saya tidak berpikir ini sepenuhnya akurat (untuk misalnya menempel ke terminal) karena Anda harus cdmasuk abc/terlebih dahulu sebelum Anda dapat checkout cabang
Steven Lu
@ SevenLu Anda benar tentu saja. Saya lebih memilih konsep daripada cut-and-paste, tapi mungkin seakurat mungkin. Saya telah menambahkan cd.
grossvogel
81

Anda dapat menggunakan arsip git untuk mengunduh bola tar untuk tag yang diberikan atau melakukan id:

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

Anda juga dapat mengekspor arsip zip suatu tag.

  1. Daftar tag:

    git tag
    
    0.0.1
    0.1.0
    
  2. Ekspor tag:

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

    • Anda tidak perlu menentukan formatnya. Itu akan diambil oleh nama file output.
    • Menentukan awalan akan membuat kode Anda diekspor ke direktori (jika Anda menyertakan garis miring tambahan).
Chris J
sumber
3
Perintah ini tidak berfungsi dengan submodul, lihat stackoverflow.com/questions/1591387/…
Zitrax
3
Tetapi arsip git juga menghilangkan kontrol versi, jadi Anda tidak bisa hanya melakukan checkout git lain untuk meningkatkan ke tag berikutnya.
idbrii
9
Ya, Anda kehilangan kontrol versi tetapi arsip waktu git menghemat dibandingkan dengan git klon TIDAK BENAR-BENAR DAPAT DIPERCAYA! +1
MarcH
Ini SANGAT DEKAT dengan apa yang saya inginkan, kecuali yang git archivememinta saya kata sandi ketika semua yang ingin saya lakukan adalah mengunduh dari repo publik. Bagaimana saya bisa membuatnya menggunakan http, bukan ssh?
robru
1
Ini gagal dengan fatal: Operation not supported by protocol.dan Unexpected end of command streamkesalahan. Atau, itu juga dapat mengembalikan fatal: The remote end hung up unexpectedlykesalahan.
Acumenus
52

Gunakan --single-branchsakelar (tersedia pada Git 1.7.10) . Sintaksnya adalah:

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

Sebagai contoh:

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

Manfaatnya: Git akan menerima objek dan (perlu) menyelesaikan delta hanya untuk cabang / tag yang ditentukan - sambil memeriksa jumlah file yang persis sama! Bergantung pada repositori sumber, ini akan menghemat banyak ruang disk. (Plus, itu akan jauh lebih cepat.)

eyecatchUp
sumber
3
Siapa pun yang menurunkan / menurunkan suara jawaban ini: Silakan tinggalkan komentar dengan penjelasan singkat untuk penurunan suara. (Hanya bertanya, karena aku agak bingung. Karena, afaik, ini adalah solusi terbaik untuk masalah yang diberikan. Dan jika kamu tidak berpikir begitu, aku ingin tahu kenapa.) Terima kasih banyak.
eyecatchUp
5
Jangan mencoba terlalu memahami downvote .. jawaban Anda sangat bagus, downvote mereka kemungkinan besar tidak berdasar .. itu kehidupan di SOF ..
javadba
tidak bekerja pada git versi 2.22.0.windows.1
Mahesh
29

pertama-tama ambil semua tag di kendali jarak jauh tertentu

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

atau cukup ketik saja

git fetch <remote>

Kemudian periksa tag yang tersedia

git tag -l

kemudian beralih ke tag tertentu menggunakan perintah di bawah ini

git checkout tags/<tag_name>

Semoga ini bisa membantu Anda!

tk_
sumber
mengapa menggunakan ´git tag -l´ harus sama dengan ´git tag´?
serup
1
@ server; git tagakan menambahkan tag sementara git tag -lmencantumkan tag yang tersedia
Joost Döbken
18

Jika tag Anda dapat disortir menggunakan sortperintah linux , gunakan ini:

git tag | sort -n | tail -1

misalnya. jika git tagkembali:

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

git tag | sort -n | tail -1 akan menampilkan:

v1.0.5

git tag | sort -n | tail -2 | head -1 akan menampilkan:

v1.0.4

(karena Anda meminta tag terbaru kedua)

untuk checkout tag, klon repo pertama, lalu ketik:

git checkout v1.0.4

..atau tag apa pun yang Anda butuhkan.

Peter Johnson
sumber
25
Sampai Anda mencapai v1.0.10, dan kemudian hal-hal buruk terjadi :)
Laurent Grégoire
10
Agar tag Anda diurutkan secara kronologis:git for-each-ref --sort='*authordate' --format='%(tag)' refs/tags
Bob G
One-liner untuk secara otomatis checkout versi terbaru,git checkout `git tag | sort -n | tail -1`
weiji14
Anda mungkin ingin menggunakannya sort -Vsebagai gantinya sort -n. Yang pertama menangani versi dengan benar, yang tidak harus numerik, misalnya "1.2.3". Ia juga memahami bahwa "0.4.10" muncul setelah "0.4.1" dan bukan setelah "0.4.2" yang -nakan memberi Anda.
Mateusz Misiorny
16

Saya memeriksa dokumentasi checkout git , ia mengungkapkan satu hal yang menarik:

git checkout -b <new_branch_name> <start_point>, di mana <start_point> adalah nama komit untuk memulai cabang baru; Default ke KEPALA

Jadi kita dapat menyebutkan nama tag (karena tag tidak lain adalah nama dari sebuah commit), misalnya:

>> git checkout -b 1.0.2_branch 1.0.2
nanti, modifikasi beberapa file
>> git push --tags

PS: Di Git, Anda tidak dapat memperbarui tag secara langsung (karena tag hanya label untuk komit), Anda perlu checkout tag yang sama dengan cabang dan kemudian komit untuk itu dan kemudian membuat tag terpisah.

Tidak ada-da
sumber
1
Atau jika Anda tidak berharap untuk membuat perubahan dan Anda hanya ingin melihat seperti apa kode pada tag itu, Anda bisa checkout tag tanpa membuat cabang. Anda akan mendapatkan beberapa teks yang menjelaskan bahwa Anda berada dalam keadaan "kepala terpisah", dan Anda selalu dapat membuat cabang nanti jika Anda mau.
MatrixFrog
16
git fetch <gitserver> <remotetag>:<localtag>

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

Saya baru saja melakukan ini. Pertama saya memastikan saya tahu ejaan nama tag.

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

Ini memberi saya daftar tag pada server git saya untuk dipilih. Poster asli sudah tahu nama tag-nya sehingga langkah ini tidak diperlukan untuk semua orang. Outputnya terlihat seperti ini, meskipun daftar sebenarnya lebih panjang.

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

Saya mengambil tag yang saya inginkan dan mengambilnya dan tidak lebih sebagai berikut.

git fetch gitserver Fix_110

Saya kemudian menandai ini di mesin lokal saya, memberi tag saya nama yang sama.

git tag Fix_110 FETCH_HEAD

Saya tidak ingin mengkloning repositori jarak jauh seperti yang disarankan orang lain, karena proyek yang saya kerjakan besar dan saya ingin berkembang dalam lingkungan bersih yang bagus. Saya merasa ini lebih dekat dengan pertanyaan awal "Saya mencoba mencari tahu bagaimana cara mengunduh A PARTICULAR TAG" daripada solusi yang menyarankan kloning seluruh repositori. Saya tidak melihat mengapa orang harus memiliki salinan kode sumber Windows NT dan Windows 8.1 jika mereka ingin melihat kode sumber DOS 0.1 (misalnya).

Saya juga tidak ingin menggunakan CHECKOUT seperti yang disarankan orang lain. Saya telah memeriksa cabang dan tidak ingin memengaruhi hal itu. Tujuan saya adalah untuk mengambil perangkat lunak yang saya inginkan sehingga saya bisa memilih sesuatu dan menambahkannya ke pengembangan saya.

Mungkin ada cara untuk mengambil tag itu sendiri daripada hanya salinan komit yang ditandai. Saya harus menandai komit yang diambil sendiri. EDIT: Ah ya, saya sudah menemukannya sekarang.

git fetch gitserver Fix_110:Fix_110

Di mana Anda melihat titik dua, itu adalah nama-jauh: nama lokal dan di sini mereka adalah nama tag. Ini berjalan tanpa mengganggu pohon yang bekerja dll. Sepertinya menyalin hal-hal dari remote ke mesin lokal sehingga Anda memiliki salinan Anda sendiri.

git fetch gitserver --dry-run Fix_110:Fix_110

dengan opsi --dry-run ditambahkan akan membiarkan Anda melihat apa yang akan dilakukan perintah, jika Anda ingin memverifikasi apa yang Anda inginkan. Jadi saya rasa sederhana

git fetch gitserver remotetag:localtag

adalah jawaban sebenarnya.

=

Catatan terpisah tentang tag ... Ketika saya memulai sesuatu yang baru saya biasanya menandai repositori kosong setelah git init, sejak itu

git rebase -i XXXXX 

membutuhkan komit, dan pertanyaan muncul "bagaimana Anda rebase perubahan yang mencakup perubahan perangkat lunak pertama Anda?" Jadi ketika saya mulai bekerja saya lakukan

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

yaitu membuat komit sebelum perubahan nyata pertama saya dan kemudian digunakan

git rebase -i EMPTY 

jika saya ingin rebase semua pekerjaan saya, termasuk perubahan pertama .

Ivan
sumber
8

Menolak jawaban Peter Johnson, saya membuat alias kecil yang menyenangkan untuk diri saya sendiri:

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

alias 'git checkout tag terbaru'.

Ini bergantung pada versi semacam GNU, yang secara tepat menangani situasi seperti yang ditunjukkan oleh lOranger:

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

Jika Anda menggunakan mac, brew install coreutilsdan panggil gsort sebagai gantinya.

billkw
sumber
6

mencoba:

git clone -b <name_of_the_tag> <repository_url> <destination>
Kamil Zając
sumber
Jika ada beberapa cabang untuk repositori maka cabang mana yang akan dikloning?
tauseef_CuriousGuy
5

Lihat Tag

Jika Anda ingin melihat versi file yang ditunjuk oleh tag, Anda dapat melakukan checkout git, meskipun ini membuat repositori Anda berada dalam status "detached HEAD", yang memiliki beberapa efek samping buruk:

$ 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

Dalam keadaan "KEPALA terlepas", jika Anda melakukan perubahan dan kemudian membuat komit, tag akan tetap sama, tetapi komit baru Anda tidak akan menjadi milik cabang apa pun dan tidak akan dapat dijangkau, kecuali oleh hash komit yang tepat. Jadi, jika Anda perlu melakukan perubahan — katakanlah Anda memperbaiki bug pada versi yang lebih lama, misalnya — Anda biasanya ingin membuat cabang:

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

Jika Anda melakukan ini dan membuat komit, cabang versi2 Anda akan sedikit berbeda dari tag v2.0.0 Anda karena itu akan bergerak maju dengan perubahan baru Anda, jadi berhati-hatilah.

artamonovdev
sumber
4

Saya melakukan ini melalui API github:

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 ; \
J0hnG4lt
sumber
1
Ini berfungsi untuk cabang dan tag, tetapi bukan kepala master yang membutuhkan tag yang dibuat untuk melawannya. Imho cara yang cukup elegan untuk mendapatkan versi berukuran minimal.
J0hnG4lt