Tag & komitmen git dilakukan secara bersamaan

387

Saya menyadari alasan bahwa git push --tagsini adalah operasi yang terpisah dari yang lama git push. Menekan tag harus menjadi pilihan sadar karena Anda tidak ingin mendorongnya secara tidak sengaja. Tidak apa-apa. Tetapi apakah ada cara untuk menyatukan keduanya? (Selain dari git push && git push --tags.)

Will Robertson
sumber
4
Apa masalahmu git push && git push --tags?
fuz
21
Tidak ada yang khusus, itu hanya lebih lambat karena koneksi harus dibuat dua kali.
Will Robertson
16
Lihat jawaban saya yang diperbarui di bawah ini: ada --follow-tagsopsi baru sejak git 1.8.3
VonC
24
Alasan lain untuk tidak melakukan ini secara terpisah, adalah untuk menghindari memicu dua CI membangun untuk komit yang sama, ketika Anda memiliki otomatisasi semacam itu di tempat.
Alex R
juga --tagstidak membedakan antara sumber
karlsebal

Jawaban:

555

Perbarui Mei 2015

Pada git 2.4.1 , Anda bisa melakukannya

git config --global push.followTags true

Jika disetel ke true aktifkan opsi --follow-tag secara default.
Anda dapat mengganti konfigurasi ini pada saat dorong dengan menetapkan --tidak-ikuti-tag.

Sebagaimana dicatat dalam utas ini oleh Matt Rogers menjawab Wes Hurd :

--follow-tags hanya mendorong tag beranotasi .

git tag -a -m "I'm an annotation" <tagname>

Itu akan didorong (sebagai lawan dari git tag <tagname>, tag ringan, yang tidak akan didorong, seperti yang saya sebutkan di sini )

Perbarui April 2013

Sejak git 1.8.3 (22 April, 2013) , Anda tidak lagi harus melakukan 2 perintah untuk mendorong cabang, dan kemudian untuk mendorong tag :

--follow-tagsOpsi " " baru memberi tahu " git push" untuk mendorong tag beranotasi yang relevan saat mendorong cabang keluar .

Anda sekarang dapat mencoba, ketika mendorong komit baru:

git push --follow-tags

Namun itu tidak akan mendorong semua tag lokal, hanya yang direferensikan oleh komit yang didorong dengan git push.

Git 2.4.1+ (Q2 2015) akan memperkenalkan opsi push.followTags: lihat " Cara membuat" git push"sertakan tag dalam cabang? ".

Jawaban asli, September 2010

Opsi nuklir akan menjadi git push --mirror, yang akan mendorong semua referensi di bawah refs/.

Anda juga dapat menekan hanya satu tag dengan komit cabang Anda saat ini:

git push origin : v1.0.0 

Anda dapat menggabungkan --tagsopsi dengan refspec seperti:

git push origin --tags :

(Karena --tagsberarti: Semua ref di bawah refs/tagsdidorong, selain refspec secara eksplisit terdaftar di baris perintah )


Anda juga memiliki entri ini " Mendorong cabang dan tag dengan satu doa " git push "

Tip praktis baru saja diposting ke milis Git oleh Zoltán Füzesi:

Saya gunakan .git/configuntuk menyelesaikan ini:

[remote "origin"]
    url = ...
    fetch = +refs/heads/*:refs/remotes/origin/*
    push = +refs/heads/*
    push = +refs/tags/*

Dengan baris ini ditambahkan git push originakan mengunggah semua cabang dan tag Anda. Jika Anda hanya ingin mengunggah beberapa di antaranya, Anda dapat menghitungnya.

Belum mencobanya sendiri, tetapi sepertinya itu mungkin berguna sampai beberapa cara lain mendorong cabang dan tag pada saat yang sama ditambahkan ke git push.
Di sisi lain, saya tidak keberatan mengetik:

$ git push && git push --tags

Waspadalah , seperti dikomentari oleh Aseem Kishore

push = +refs/heads/*akan memaksa-mendorong semua cabang Anda .

Ini menggangguku sekarang, jadi FYI.


René Scheibe menambahkan komentar menarik ini :

The --follow-tagsparameter menyesatkan karena hanya tag di bawah .git/refs/tagsdianggap.
Jika git gcdijalankan, tag dipindahkan dari .git/refs/tagske .git/packed-refs. Setelah git push --follow-tags ...itu tidak berfungsi seperti yang diharapkan lagi.

VONC
sumber
3
Satu komentar pada posting yang Anda tautkan dengan benar menunjukkan bahwa push = +refs/heads/*garis memaksa -mencabut semua cabang Anda. Ini menggangguku sekarang, jadi FYI.
Aseem Kishore
2
Re: --follow-tagsflag yang ditambahkan pada git 1.8.3, dapatkah saya mengkonfigurasi instalasi git saya untuk menjadikannya default?
Trevor Burnham
1
@TrevorBurnham tidak ada, hanya nilai push.default( git-scm.com/docs/git-config ) dapat menentukan tindakan default pada dorongan ( nothing, matching, upstream, simpleseperti di stackoverflow.com/a/10002469/6309 ). Anda perlu menambahkan --follow-tagsecara eksplisit.
VonC
1
@VonC Bagaimana jika saya ingin memaksa mendorong tag? git push --follow-tags -ftidak bekerja untuk saya.
mauryat
1
The --follow-tagsparameter menyesatkan karena hanya tag di bawah .git/refs/tagsdianggap. Jika git gcdijalankan, tag dipindahkan dari .git/refs/tagske .git/packed-refs. Setelah git push --follow-tags ...itu tidak berfungsi seperti yang diharapkan lagi.
René Scheibe
4

Mungkin ini membantu seseorang:

 1. git commit -a -m "msg"  
 2. git tag 0.1.0                // creates a new tag locally     
 3. git push origin tag 0.1.0    // pushes the tag & the code in the remote repo          
Rajesh Gupta
sumber
Saya mencoba solusi Anda dengan git-2.21.0.windows.1 dan menemukan bahwa 3 hanya mendorong tag
Dustin Sun
Ini bekerja dengan baik pada akhirnya. Anda mencoba semua 3 perintah dengan benar dan repo jarak jauh diatur (git remote -v)?
Rajesh Gupta
Saya menggunakan "git commit -m" msg "pada langkah 1 dan tidak ada parameter -a. Ini bisa menjadi alasannya. Terima kasih atas tindak lanjutnya!
Dustin Sun
2

@ sejak Git 2.4

git push --atomic origin <branch name> <tag>

SoBeRich
sumber
0

Git GUI

Git GUI memiliki tombol PUSH - maafkan plesetannya, dan kotak dialog yang terbuka memiliki kotak centang untuk tag.

Saya mendorong cabang dari baris perintah, tanpa tag, dan kemudian mencoba lagi mendorong cabang menggunakan --follow-tagsopsi yang diuraikan di atas. Opsi ini dijelaskan sebagai tag beranotasi berikut. Tag saya adalah tag sederhana.

Saya telah memperbaiki sesuatu, menandai komit dengan perbaikan di, (jadi kolega dapat memilih perbaikan,) kemudian mengubah nomor versi perangkat lunak dan menandai rilis yang saya buat (sehingga kolega dapat mengkloning rilis itu).

Git kembali dan mengatakan semuanya sudah terbaru. Itu tidak mengirim tag! Mungkin karena tag tidak beranotasi. Mungkin karena tidak ada yang baru di cabang.

Ketika saya melakukan dorongan serupa dengan Git GUI, tag dikirim.

Tag dikirim dengan Git GUI

Untuk saat ini, saya akan mendorong perubahan saya ke remote dengan Git GUI dan bukan dengan baris perintah dan --follow-tags.

Ivan
sumber