Git etiketini refspec kullanarak bir şubeye nasıl iletirsiniz?


216

Örneğin, etiketimi 1.0.0uzak masterşubeme zorlamak istiyorum .

Şimdi aşağıdakileri yapıyorum:

git push production +1.0.0:master

Ben itmek zorlamak istiyorum , çünkü tek umurumda1.0.0etiketiiçindeki kodmasteruzak depoda şubeyeitilir olmasıdır.

Neyi yanlış yapıyorum?

Güncelleme # 1

Git depomun bulunduğu ve yürüttüğü sunucuma SSH git branch -lgirdiğimde, masterşubeyi de görmüyorum .

Güncelleme # 2

git tag -lUzak Git deposunun içinden çalıştırdıktan sonra master, listelendiğini görüyorum , yani aşağıdakileri çalıştırdığımda:

git push production 1.0.0:master

Aslında etiketi itti ve yeni bir dal yerine adında bir etiket oluşturdu .master

Temelde itmek istiyor içeriği etiketinin 1.0.0içine masteruzaktan Git depo dalı.


"Çalışmama" nın ne anlama geldiğini açıklayabilir misiniz? Git belirli bir hata veriyor mu veya boş bir etkisi var mı?
vcsjones

Üzgünüm. Evet, temelde sunucuma, git deposuna SSH ve şubeleri listelemek için git branch -l çalıştırdığımda , sadece diğer şubemi görüyorum. Ancak, git push üretimi +1.0.0: master itti, yeniden ittiğimde her şey güncel diyor , ancak uzak sunucuda ana dalı görmüyorum.
Michael van Rooijen

5
Kabul edilen cevabı değiştirmelisiniz. İkinci cevap, kabul edilmiş olarak işaretlenen cevaptan çok daha basittir.
Pedro Rolo

Geç cevap için özür dilerim. Kabul ediyorum ve şimdi kabul edilen cevabı değiştirdim.
Michael van Rooijen

1
@MichaelvanRooijen Seçtiğiniz kabul edilen cevabın bu sorunu nasıl çözdüğünü anlamıyorum . Etiketi olan bir dalın üzerine yazmaz, yalnızca etiketlerinizi uzaktan kumandaya iter.

Yanıtlar:


61

1.0.0Ek açıklama eklenmiş bir etiket olduğu için muhtemelen başarısız oluyor . Belki de aşağıdaki hata mesajını gördünüz:

hata: şube refs / heads / master'a taahhütte bulunmayan nesne yazmaya çalışmak

Ek açıklamalı etiketlerin, etiketli tamamlama nesnesini gösteren kendi farklı nesne türleri vardır. Dallar, nesneleri etiketlemek için yararlı bir şekilde gösteremez, yalnızca nesneleri taahhüt eder. Nesneyi işlemek için ek açıklamalı etiketi "soymanız" ve bunun yerine itmeniz gerekir.

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

Bu durumda da işe yarayacak başka bir sözdizimi vardır, ancak etiket nesnesi bir taahhüdü (veya bir noktayı işaret eden bir etiket nesnesi) gösteren bir etiket nesnesi) .

git push production +1.0.0^{}:master

Bu etiket soyma sözdizimleri, Düzeltmeleri Belirleme altında git-rev-ayrıştırma (1) bölümünde açıklanmıştır .


1
Bu sorunu çözdü! Ancak ana dalın zaten var olması gerekir. Ancak bu benim için bir sorun değil. Yardımın için çok teşekkürler!
Michael van Rooijen

2
@Michael: Ahh. Evet, master yoksa (şube veya etiket olarak), şube yerine mastergit push rep +tag:master adlı bir etiket oluşturur . (yine, master bir şube veya etiket olarak mevcut olmadığında) "error: nitelenmemiş hedefe itilemez" ile başarısız olur. İstediğinizi (herhangi bir ana dal / etiket var olmadan önce) yapacak olan komut ( dalların saklandığı ad alanıdır). git push rep +tag~0:mastergit push rep +tag~0:refs/heads/masterrefs/heads/
Chris Johnsen

HARİKA! Bu bana çok iyi yardımcı olacak. Çok uygun! Bu bilgiyi de paylaştığınız için çok teşekkürler.
Michael van Rooijen

4
@brad: ~{commit}Sözdizimi değişmezdir (yani her zaman bu dokuz karakter); kelime commitburada bir yer tutucu değil.
Chris Johnsen

1
Ah tamam! özür dilerim, belirli bir taahhütte bulunmak istediğinizi düşünüyordum, şimdi daha mantıklı.
brad

469
git push --tags production

4
Etiket uzaktan kumandada zaten varsa, önce uzak etiketi silmeniz gerekir git push production :1.0.0.
respectTheCode

1
Herhangi bir vesileyle aynı ada sahip şube varsa: '1.0.0' bu itme çok daha iyi başarısız olur: git push production :refs/tags/1.0.0sadece etiketi silmek için
Vladimir

1
@Nerian: Sanırım sadece etiketleri itiyor
bstpierre

5
Bu, orijinal posterin bir şubeyi bir etikete zorlamak suretiyle üzerine yazma konusundaki problemini gerçekten nasıl zorlar? Bu, tüm etiketlerinizi uzaktan kumandaya iter, herhangi bir dalın üzerine yazmaz.

1
Soru bir etiketi nasıl bastıracağınızı sormuyor mu? Bu komut bundan çok daha fazlasını yapar.
Chris Martin

61

Ben böyle etiket oluşturmak ve sonra GitHub itmek:

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 git@github.com:neoneye/triangle_draw.git
 * [new tag]         v1.1 -> v1.1

4
tüm etiketlerini itmek
Dawid Drozd

2
Bunun, orijinal posterin etiketli bir dalın üzerine yazılması sorununu çözmeyeceğini, etiketlerinizi dalları etkilemeden bir uzaktan kumandaya iteceğini unutmayın.

10

Tek bir etiketi itmek için: git push <reponame> <tagname>

Örneğin git push production 1.0.0,. Etiketler dallara bağlı değil, taahhütlere bağlı.

Etiketin içeriğinin ana dalda olmasını istediğinizde, bunu makinenizde yerel olarak yapın. Yerel master şubenizde gelişmeye devam ettiğinizi varsayacağım. O zaman sadece bir git push origin masteryeterlidir.


5
Bunun, orijinal posterin etiketli bir dalın üzerine yazılması sorununu çözmeyeceğini, etiketlerinizi dalları etkilemeden bir uzaktan kumandaya iteceğini unutmayın.
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.