Wciśnij jednocześnie zatwierdzenia i tagi git

387

Zdaję sobie sprawę z powodu, że git push --tagsjest to osobna operacja niż zwykła stara git push. Pchanie tagów powinno być świadomym wyborem, ponieważ nie chcesz przypadkowego popchnięcia. W porządku. Ale czy istnieje sposób, by połączyć oba te elementy? (Oprócz git push && git push --tags.)

Will Robertson
źródło
4
Z czym masz problem git push && git push --tags?
fuz
21
Nic szczególnego, jest po prostu wolniejsze, ponieważ połączenie musi zostać nawiązane dwukrotnie.
Will Robertson,
16
Zobacz moją zaktualizowaną odpowiedź poniżej: istnieje nowa --follow-tagsopcja od git 1.8.3
VonC
24
Innym powodem, aby nie robić tego osobno, jest uniknięcie wyzwalania dwóch kompilacji CI dla tego samego zatwierdzenia, gdy masz taką automatyzację.
Alex R
--tagsnie rozróżnia także źródła
karlsebal,

Odpowiedzi:

555

Aktualizacja maja 2015 r

Od wersji 2.4.1 możesz to zrobić

git config --global push.followTags true

Jeśli ustawione na true, domyślnie włącz opcję --follow-tags.
Możesz zignorować tę konfigurację w momencie wypychania, określając --no-follow-tags.

Jak zauważono w tym wątku przez Matta Rogersa, który odpowiedział Wesowi Hurdowi :

--follow-tags wypycha tylko tagi z adnotacjami .

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

Zostałoby to popchnięte (w przeciwieństwie do git tag <tagname>lekkiego tagu, który nie zostałby popchnięty, jak wspomniałem tutaj )

Aktualizacja kwietnia 2013 r

Od git 1.8.3 (kwiecień 22d, 2013) , nie będzie już trzeba zrobić 2 polecenia naciskać gałęzie, a następnie wcisnąć tagi :

Nowa --follow-tagsopcja „ ” mówi „ git push”, aby wypychać odpowiednie tagi z adnotacjami podczas wypychania gałęzi .

Możesz teraz spróbować, wypychając nowe zatwierdzenia:

git push --follow-tags

Nie wypchnie to jednak wszystkich lokalnych znaczników, tylko tych, do których odwołują się commits, które są wypychane za pomocą git push.

Git 2.4.1+ (II kwartał 2015 r.) Wprowadzi opcję push.followTags: zobacz „ Jak zrobić”, aby git pushzawierał tagi w oddziale? ”.

Oryginalna odpowiedź, wrzesień 2010 r

Opcja nuklearna byłaby git push --mirror, która zepchnie wszystkie referencje pod refs/.

Możesz również wcisnąć tylko jeden tag z bieżącym zatwierdzeniem gałęzi:

git push origin : v1.0.0 

Możesz połączyć --tagsopcję z refspec, takim jak:

git push origin --tags :

(ponieważ --tagsoznacza refs/tagsto, że wszystkie referencje poniżej są wypychane, oprócz referencji wyraźnie wymienionych w wierszu poleceń )


Masz również ten wpis „ Pchanie gałęzi i tagów za pomocą pojedynczego wywołaniagit push

Przydatna wskazówka została właśnie wysłana do listy mailingowej Git przez Zoltána Füzesi:

Używam .git/configdo rozwiązania tego:

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

Po dodaniu tych wierszy git push originzostaną przesłane wszystkie gałęzie i tagi. Jeśli chcesz przesłać tylko niektóre z nich, możesz je wymienić.

Nie próbowałem tego jeszcze sam, ale wygląda na to, że może się przydać, dopóki inny sposób wypychania gałęzi i tagów w tym samym czasie nie zostanie dodany do git push.
Z drugiej strony nie mam nic przeciwko pisaniu:

$ git push && git push --tags

Strzeż się , jak skomentował przez Aseem Kishore

push = +refs/heads/*będzie na siłę wpycha wszystkie swoje oddziały .

To mnie teraz ugryzło, więc FYI.


René Scheibe dodaje ten interesujący komentarz :

Ten --follow-tagsparametr wprowadza w błąd, ponieważ .git/refs/tagsbrane są pod uwagę tylko tagi poniżej .
Jeśli git gczostanie uruchomiony, tagi zostaną przeniesione z .git/refs/tagsdo .git/packed-refs. Później git push --follow-tags ...nie działa już zgodnie z oczekiwaniami.

VonC
źródło
3
Jeden komentarz na stanowisku Ci link do prawidłowo wskazuje, że push = +refs/heads/*linia siła -pushes wszystkie swoje oddziały. To mnie teraz ugryzło, więc FYI.
Aseem Kishore,
2
Re: --follow-tagsflaga dodana w git 1.8.3, czy mogę skonfigurować moją instalację git, aby była domyślna?
Trevor Burnham
1
@TrevorBurnham nie tylko wartość push.default( git-scm.com/docs/git-config ) można określić domyślne akcje na push ( nothing, matching, upstream, simplejak w stackoverflow.com/a/10002469/6309 ). Musisz dodać --follow-tagwyraźnie.
VCC
1
@VonC Co zrobić, jeśli chcę wymusić naciśnięcie tagu? git push --follow-tags -fnie działało dla mnie.
mauryat
1
Ten --follow-tagsparametr wprowadza w błąd, ponieważ .git/refs/tagsbrane są pod uwagę tylko tagi poniżej . Jeśli git gczostanie uruchomiony, tagi zostaną przeniesione z .git/refs/tagsdo .git/packed-refs. Później git push --follow-tags ...nie działa już zgodnie z oczekiwaniami.
René Scheibe
4

Może to pomaga komuś:

 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
źródło
Próbowałem swoje rozwiązanie z git-2.21.0.windows.1 i okazało się, że 3 popycha tylko tag
Dustin Sun
Na moim końcu działa dobrze. Próbujesz poprawnie wykonać wszystkie 3 polecenia, a repozytorium zdalne jest ustawione (git remote -v)?
Rajesh Gupta
Użyłem „git commit -m” msg "w kroku 1 i nie było parametru -a. To może być powód. Dziękuję za kontynuację!
Dustin Sun
2

@since Git 2.4

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

SoBeRich
źródło
0

Git GUI

Git GUI ma przycisk PUSH - wybacz kalambur, a okno dialogowe, które otwiera, zawiera pole wyboru dla tagów.

Wypchnąłem gałąź z wiersza poleceń, bez tagów, a następnie spróbowałem ponownie wypchnąć gałąź za pomocą --follow-tags opcji opisanej powyżej. Opcja jest opisana jako następujące tagi z adnotacjami. Moje tagi były prostymi tagami.

Naprawiłem coś, oznaczyłem zatwierdzenie poprawką w (aby koledzy mogli wybrać poprawkę), a następnie zmieniłem numer wersji oprogramowania i oznaczyłem utworzone przeze mnie wydanie (aby koledzy mogli sklonować tę wersję).

Git wrócił, mówiąc, że wszystko jest aktualne. Nie wysłał tagów! Być może dlatego, że tagi nie zostały opatrzone adnotacjami. Być może dlatego, że w oddziale nie było nic nowego.

Kiedy zrobiłem podobny push z Git GUI, tagi zostały wysłane.

Tagi wysłane z Git GUI

Na razie zamierzam wprowadzać zmiany w moich pilotach za pomocą Git GUI, a nie za pomocą wiersza poleceń i --follow-tags.

Ivan
źródło