Bagaimana Anda mendorong tag Git ke cabang menggunakan refspec?

216

Saya ingin memaksakan push, misalnya, tag 1.0.0saya ke mastercabang jarak jauh saya .

Saya sekarang melakukan hal berikut:

git push production +1.0.0:master

Saya ingin memaksakan dorongan , karena yang saya pedulikan adalah bahwa kode di dalam1.0.0tag didorong kemastercabang pada repositori jarak jauh.

Apa yang saya lakukan salah?

Perbarui # 1

Ketika saya SSH ke server saya di mana repositori Git saya dan jalankan git branch -l, saya tidak melihat mastercabang terdaftar.

Perbarui # 2

Setelah menjalankan git tag -ldari dalam repositori Git jarak jauh, saya melihat yang masterterdaftar, artinya ketika saya menjalankan yang berikut:

git push production 1.0.0:master

Ini benar-benar mendorong tag dan membuat tag bernama master daripada cabang baru .

Pada dasarnya saya ingin mendorong isi tag 1.0.0ke mastercabang repositori Git jarak jauh.

Michael van Rooijen
sumber
Bisakah Anda menjelaskan apa artinya "tidak berfungsi"? Apakah Git memberikan kesalahan tertentu, atau apakah itu memiliki efek nol?
vcsjones
Maafkan saya. Ya, jadi pada dasarnya ketika saya SSH ke server saya, ke repositori git, dan menjalankan git branch -l untuk mendaftar cabang, saya hanya melihat cabang saya yang lain. Namun, produksi push git +1.0.0: master melakukan push, suatu ketika saya kembali mendorongnya mengatakan Semuanya up-to-date , tapi saya tidak melihat cabang master di server jauh.
Michael van Rooijen
5
Anda harus mengubah jawaban yang diterima. Jawaban kedua jauh lebih sederhana daripada yang ditandai sebagai diterima.
Pedro Rolo
Maaf atas tanggapan yang terlambat. Saya setuju dan sekarang telah mengubah jawaban yang diterima.
Michael van Rooijen
1
@MichaelvanRooijen Saya tidak mengerti bagaimana jawaban yang diterima yang Anda pilih benar-benar menyelesaikan masalah ini. Itu tidak menimpa cabang dengan tag, itu hanya mendorong tag Anda ke remote.

Jawaban:

61

Mungkin gagal karena 1.0.0merupakan tag beranotasi. Mungkin Anda melihat pesan kesalahan berikut:

error: Mencoba menulis objek non-komit ke ref cabang / kepala / master

Tag beranotasi memiliki jenis objeknya sendiri yang berbeda yang menunjuk ke objek commit yang ditandai. Cabang tidak bisa dengan mudah menunjuk ke objek tag, hanya melakukan objek. Anda perlu "mengupas" tag beranotasi kembali untuk mengkomit objek dan mendorongnya.

git push production +1.0.0^{commit}:master
git push production +1.0.0~0:master          # shorthand

Ada sintaks lain yang juga berfungsi dalam kasus ini, tetapi ini berarti sesuatu yang sedikit berbeda jika objek tag menunjuk ke sesuatu selain komit (atau objek tag yang menunjuk ke (objek tag yang menunjuk ke ...) komit) .

git push production +1.0.0^{}:master

Sintaks mengupas tag ini dijelaskan dalam git-rev-parse (1) di bawah Menentukan Revisi .

Chris Johnsen
sumber
1
Ini menyelesaikan masalah! Namun cabang master perlu sudah ada. Namun ini bukan masalah bagi saya. Terima kasih banyak atas bantuan Anda!
Michael van Rooijen
2
@Michael: Ahh. Ya, jika master tidak ada (sebagai cabang atau tag), maka git push rep +tag:masterakan membuat tag bernama master bukan cabang. git push rep +tag~0:master(sekali lagi, ketika master tidak ada sebagai cabang atau tag) akan gagal dengan "kesalahan: tidak dapat mendorong ke tujuan yang tidak memenuhi syarat". Perintah yang akan melakukan apa yang Anda inginkan (sebelum ada cabang master / tag) adalah git push rep +tag~0:refs/heads/master( refs/heads/adalah namespace tempat cabang disimpan).
Chris Johnsen
BAGUS! Itu akan membantu saya dengan sangat baik. Sangat mudah! Terima kasih banyak untuk memposting informasi itu juga.
Michael van Rooijen
4
@brad: ~{commit}Sintaksnya literal (yaitu selalu sembilan karakter itu); kata commititu bukan pengganti di sini.
Chris Johnsen
1
ah baiklah! maaf, saya pikir Anda bermaksud memasukkan komit tertentu, lebih masuk akal sekarang.
brad
469
git push --tags production
bstpierre
sumber
4
Jika tag sudah ada pada remote, Anda harus menghapus dulu tag remote git push production :1.0.0.
respectTheCode
1
Jika dengan cara apa pun Anda akan memiliki cabang dengan nama yang sama: '1.0.0' push ini akan gagal digunakan lebih baik: git push production :refs/tags/1.0.0untuk menghapus tag saja
Vladimir
1
@Nerian: Saya pikir itu hanya mendorong tag
bstpierre
5
Bagaimana ini sebenarnya memecahkan masalah poster asli tentang menimpa cabang dengan tag dengan mendorongnya secara paksa? Ini hanya mendorong semua tag Anda ke jarak jauh, itu tidak akan menimpa cabang apa pun.
1
Bukankah pertanyaannya menanyakan cara mendorong satu tag? Perintah ini melakukan jauh lebih banyak dari itu.
Chris Martin
61

Saya membuat tag seperti ini dan kemudian mendorongnya ke GitHub:

git tag -a v1.1 -m "Version 1.1 is waiting for review"
git push --tags

Counting objects: 1, done.
Writing objects: 100% (1/1), 180 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To [email protected]:neoneye/triangle_draw.git
 * [new tag]         v1.1 -> v1.1
neoneye
sumber
4
itu mendorong semua tag Anda
Dawid Drozd
2
Perhatikan bahwa ini tidak akan benar-benar menyelesaikan masalah poster asli tentang menimpa cabang dengan tag, itu hanya akan mendorong tag Anda ke jarak jauh, tanpa mempengaruhi cabang.
10

Untuk mendorong satu tag: git push <reponame> <tagname>

Misalnya git push production 1.0.0,. Tag tidak terikat pada cabang, mereka terikat pada komitmen.

Saat Anda ingin memiliki konten tag di cabang master, lakukan itu secara lokal di mesin Anda. Saya akan berasumsi bahwa Anda terus berkembang di cabang master lokal Anda. Maka cukup saja git push origin mastersudah cukup.

koppor
sumber
5
Perhatikan bahwa ini tidak akan benar-benar menyelesaikan masalah poster asli tentang menimpa cabang dengan tag, itu hanya akan mendorong tag Anda ke jarak jauh, tanpa mempengaruhi cabang.