Vairāk
Kas ir git tag, Kā izveidot tagus & amp; Kā pārbaudīt git tālvadības tag(s)
kad es izrakstīšanās attālā git tag izmantot komandu, piemēram, šādu:
git checkout -b local_branch_name origin/remote_tag_name
Es saņēmu šādu kļūdu:
error: pathspec `origin/remote_tag_name` did not match any file(s) known to git.
Es varu atrast remote_tag_name, kad izmantoju komandu git tag.
467
3
Sāksim ar skaidrojumu par to, kas ir git birka.
Jūs nevarēsiet pārbaudīt tagus, ja tie nebūs lokāli jūsu repozitorijā, tāpēc vispirms jums ir jāpaņem tagi no jūsu lokālā repozitorija.
Vispirms pārliecinieties, ka tagi eksistē lokāli, veicot
Pēc tam pārbaudiet tagu, palaižot
Tā vietā, lai ierakstītu
origin
, izmantojiet prefiksutags/
.Šajā paraugā ir 2 tagi 1.0 & amp; versija 1.1, tos var pārbaudīt, izmantojot jebkuru no šīm iespējām:
Visi iepriekš minētie piemēri būs vienādi, jo tags ir tikai norāde uz konkrēto kopiju.
Kā apskatīt visu tagu sarakstu?
Kā izveidot tagus?
Ir 2 veidi, kā izveidot birku:
Atšķirība starp abiem veidiem ir tāda, ka, veidojot anotētu birku, jūs varat pievienot metadatus tāpat kā git commit:
vārdu, e-pastu, datumu, komentāru & amp; parakstu.
Kā dzēst tagus?
Kā klonēt konkrētu tagu?
Lai paņemtu konkrētas birkas saturu, varat izmantot
checkout
komandu.Kā paskaidrots iepriekš, tagi ir tādi paši kā jebkurš cits commits, tāpēc mēs varam izmantot
checkout
un SHA-1 vietā vienkārši aizstāt to ar tag_name.1. iespēja:
Variants 2:
Izmantojot komandu klons
Tā kā git atbalsta pietiekamu klonēšanu, pievienojot komandai klonēt komandu
--nozare
, mēs varam izmantot atzarojuma nosaukuma vietā birkas nosaukumu. Git zina, kā "pārtulkot" doto SHA-1 uz attiecīgo nodošanu.Kā pievienot tagus?
git push --tags
Visu tagu izvietošana:
Anotēto tagu un pašreizējās vēstures ķēdes tagu izspiešanai izmantojiet::
git push --follow-tags
Šis karodziņš
--follow-tags
izstumj gan nosūtījumus, gan tikai tagus, kas ir abi:Sākot ar Git 2.4, to var iestatīt, izmantojot konfigurāciju
(Šīs atbildes rakstīšana prasīja laiku, un codeWizard's atbilde ir pareiza pēc mērķa un būtības, bet ne pilnībā pilnīga, tāpēc es to vienalga publicēšu.)
Nav tādas lietas kā "attālināta Git tag". Ir tikai "tagi". Es to visu norādīju nevis tāpēc, lai būtu pedantisks, 1 bet gan tāpēc, ka vienkāršie Git lietotāji šajā jautājumā ir ļoti neizpratnē, un Git dokumentācija nav pārāk noderīga2 iesācējiem. (Nav skaidrs, vai neskaidrības rodas sliktas dokumentācijas dēļ, vai sliktā dokumentācija rodas tāpēc, ka tas jau pēc būtības ir nedaudz mulsinoši, vai kā citādi.) Ir ir "attālinātās filiāles", pareizāk tās saukt par "attālinātās sekošanas filiālēm", bet ir vērts atzīmēt, ka tās patiesībā ir vietējās vienības. Tomēr attālināto atzarojumu nav (ja vien jūs tos (no jauna) neizgudrojat). Pastāv tikai vietējās birkas, tāpēc, lai to izmantotu, birka ir jāiegūst lokāli. Vispārējā forma konkrētu nodevumu nosaukumiem - ko Git sauc par references - ir jebkura virkne, kas sākas ar
refs/
. Virkne, kas sākas arrefs/heads/
, nosauc atzaru; virkne, kas sākas arrefs/remotes/
, nosauc attālās sekošanas atzaru; un virkne, kas sākas arrefs/tags/
, nosauc tagu. Nosaukumsrefs/stash
ir atsauce uz krātuvi (kā to izmantogit stash
; ievērojiet, ka nav pēdējās slīpsvītras). Ir daži neparasti īpašo gadījumu nosaukumi, kas nesākas arrefs/
:HEAD
,ORIG_HEAD
,MERGE_HEAD
unCHERRY_PICK_HEAD
ir arī nosaukumi, kas var attiekties uz konkrētām nodevām (lai ganHEAD
parasti satur zara nosaukumu, t. i., saturref: refs/heads/branch
). Bet parasti atsauces sākas arrefs/
. Viena no lietām, ar ko Git to padara neskaidru, ir tā, ka tas ļauj izlaistrefs/
un bieži vien arī vārdu aizrefs/
. Piemēram, jūs varat izlaistrefs/heads/
vairefs/tags/
, atsaucoties uz vietējo atzaru vai tagu - un patiesībā jums jāizlaižrefs/heads/
, pārbaudot vietējo atzaru! To var darīt vienmēr, kad rezultāts ir nepārprotams, vai - kā mēs tikko norādījām - kad tas ir jādara (piemēram,git checkout branch
). Tiesa, atsauces pastāv ne tikai jūsu repozitorijā, bet arī attālinātos repozitorijos. Tomēr Git ļauj piekļūt attālā repozitorija atsaucēm tikai ļoti konkrētos laikos, proti,fetch
unpush
operāciju laikā. Lai tās redzētu, var izmantot arīgit ls-remote
vaigit remote show
, tačufetch
unpush
ir interesantāki kontakta punkti.Refspecs
Lai pārsūtītu atsauces starp vietējo un attālo repozitoriju,
fetch
unpush
laikā Git izmanto virknes, ko sauc par refspecs. Tādējādi tieši šajos brīžos, izmantojot refspecs, divi Git repozitoriji var savstarpēji sinhronizēties. Kad nosaukumi ir sinhronizēti, jūs varat izmantot to pašu nosaukumu, ko izmanto kāds, kas atrodas attālinātajā repozitorijā. Tomērfetch
ir kāda īpaša maģija, un tā ietekmē gan filiāļu, gan tagu nosaukumus. Jums vajadzētu domāt pargit fetch
kā par jūsu Git, lai izsauktu (vai, iespējams, sūtītu īsziņu) citu Git - "attālo"- un veiktu ar to sarunu. Šīs sarunas sākumā attālā iekārta uzskaita visas savas atsauces: visu, kas atrodasrefs/heads/
, un visu, kas atrodasrefs/tags/
, kā arī visas citas atsauces, kas tai ir. Jūsu Git tās skenē un (pamatojoties uz parasto fetch refspec) pārdēvē to filiāles. Aplūkosim parasto refspec attālajam ar nosaukumuorigin
:Šis refspec uzdod jūsu Git ņemt katru nosaukumu, kas atbilst
refs/heads/*
, t. i., katru attālinātā atzaru, un mainīt tā nosaukumu uzrefs/remotes/origin/*
, t. i., saglabāt atbilstīgo daļu tādu pašu, mainot atzara nosaukumu (refs/heads/
) uz attālinātā atzara nosaukumu (refs/remotes/
, īpaširefs/remotes/origin/
). Ar šo refspec* palīdzībuorigin
's atzari kļūst par jūsu attālinātās sekošanas atzariem attālajamorigin``. Filiāles nosaukums kļūst par attālinātās sekošanas filiāles nosaukumu, iekļaujot attālinātās, šajā gadījumā
origin, filiāles nosaukumu. Plusa zīme
+refspec priekšpusē nosaka "force" karogu, t.i., jūsu attālās sekošanas filiāle tiks atjaunināta, lai tā atbilstu attālās filiāles nosaukumam, neatkarīgi no tā, kas nepieciešams, lai to saskaņotu. (Bez
+` atzarojuma atjauninājumi aprobežojas ar "ātrās pārsūtīšanas" izmaiņām, un tagu atjauninājumi tiek vienkārši ignorēti kopš Git versijas 1.8.2 vai līdzīgas - pirms tam tika piemēroti tie paši ātrās pārsūtīšanas noteikumi).Tags
Bet kā ir ar tagiem? Tām nav atsauces specifikācijas - vismaz ne pēc noklusējuma. Jūs varat to iestatīt, un tādā gadījumā refspec forma ir jūsu ziņā; vai arī varat palaist
git fetch --tags
. Izmantojot-tags
, refspec pievienorefs/tags/*:refs/tags/*
, t. i., tas pārnes visas tagus (bet neatjaunina tavu tagu, ja tev jau ir tags ar šo nosaukumu, neņemot vērā, ko saka attālinātais tags Rediģēts, 2017. gada janvāris: no Git 2.10, testēšana liecina, ka--tags
piespiedu kārtā atjaunina jūsu tagus no attālinātā's tagiem, it kā refspec lasītu+refs/tags/*:refs/tags/*
; iespējams, tā ir atšķirīga uzvedība salīdzinājumā ar agrāko Git versiju). Ievērojiet, ka šeit nenotiek pārdēvēšana: ja attālinātajāorigin
ir tagsxyzzy
, bet jums nav, un jūsgit fetch origin "refs/tags/*:refs/tags/*"
, jūsu repozitorijam tiks pievienotsrefs/tags/xyzzy
(norādot uz to pašu commit, kas attālajā). Ja izmantojat+refs/tags/*:refs/tags/*
, tad jūsu birkaxyzzy
, ja jums tāda ir, tiek *aizvietota ar birku noorigin
. Tas nozīmē, ka+
piespiedu karodziņš refspec nozīmē "aizstāt manu atsauces'vērtību ar to, ko mans Git saņem no sava Git".Automātiskās birkas ielādes ielādes iegūšanas laikā
Vēsturisku iemeslu dēļ,3 ja neizmantojat ne
--tags
opciju, ne--no-tags
opciju,git fetch
veic īpašu darbību. Atcerieties, ka iepriekš mēs teicām, ka attālais sāk ar to, ka jūsu lokālajam Git tiek parādītas visas tā atsauces neatkarīgi no tā, vai jūsu lokālais Git vēlas tās redzēt vai nē.4 Jūsu Git šajā brīdī ņem vērā visas redzamās birkas. Pēc tam, kad tas sāks lejupielādēt visus nodevumu objektus, kas tam nepieciešami, lai apstrādātu to, ko tas iegūst, ja kādam no šiem nodevumiem ir tāds pats ID kā kādam no šiem tagiem, git pievienos šo tagu - vai šos tagus, ja vairākiem tagiem ir šis ID - jūsu repozitorijam. Rediģēšana, 2017. gada janvāris: testēšana liecina, ka tagad Git 2.10 ir šāda uzvedība: Ja viņu Git nodrošina tagu ar nosaukumu T, un jums nav taga ar nosaukumu T, un ar T saistītais commit ID ir priekštečs kādam no viņu atzariem, ko pārbauda jūsugit fetch
, jūsu Git pievieno T jūsu tagiem ar vai bez--tags
. Pievienojot--tags
, jūsu Git iegūst visus to tagus, kā arī piespiedu kārtā atjaunina.Apakšējā līnija
Jums var nākties izmantot
git fetch --tags
, lai iegūtu to tagus. Ja to tagu nosaukumi ir pretrunā ar jūsu esošajiem tagu nosaukumiem, jums pat var nākties (atkarībā no Git versijas) izdzēst (vai pārdēvēt) dažus no jūsu tagiem un pēc tam palaistgit fetch --tags
, lai iegūtu viņu tagus. Tā kā tagiem - atšķirībā no attālinātajiem atzariem - nav automātiskas pārdēvēšanas, jūsu tagu nosaukumiem ir jāsakrīt ar to tagu nosaukumiem, tāpēc var rasties konfliktsituācijas. Tomēr visbiežāk parastos gadījumos vienkāršsgit fetch
paveiks savu darbu, pārnesot viņu veiktās izmaiņas un tām atbilstošās birkas, un, tā kā viņi - lai kas tie būtu - atzīmēs izmaiņas brīdī, kad tās publicēs, jūs sekosiet līdzi viņu birkām. Ja jūs neizveidosiet savus tagus, nedz arī sajauksiet viņu repozitoriju ar citiem repozitorijiem (izmantojot vairākus attālinātos repozitorijus), jums nebūs arī nekādu tagu nosaukumu kolīziju, tāpēc jums nebūs jātraucas ar tagu dzēšanu vai pārdēvēšanu, lai iegūtu viņu tagus.Ja jums ir nepieciešami kvalificēti nosaukumi
Iepriekš minēju, ka
refs/
varat izlaist gandrīz vienmēr, betrefs/heads/
unrefs/tags/
un tā tālāk - gandrīz vienmēr. Bet kad *nevarat? Pilnīga (vai gandrīz pilnīga) atbilde ir atrodamagitrevisions
dokumentācijā. Git atrisinās nosaukumu uz commit ID, izmantojot sešu soļu secību, kas norādīta šajā saitē. Interesanti, ka tagi aizstāj filiāles: ja ir tagsxyzzy
un filiālexyzzy
, un tie norāda uz dažādām nodevām, tad:parādīs ID, uz kuru norāda birka. Tomēr - un tas ir tas, kā trūkst
gitrevisions
-git checkout
dod priekšroku zaru nosaukumiem, tāpēcgit checkout xyzzy
ievietos jūs atzarā, neņemot vērā tagu. Neskaidrību gadījumā jūs gandrīz vienmēr varat uzrakstīt atzarojuma nosaukumu, izmantojot tā pilnu nosaukumu,refs/heads/xyzzy
vairefs/tags/xyzzy
. (Ņemiet vērā, ka tas darbojas argit checkout
, bet, iespējams, negaidītā veidā:git checkout refs/heads/xyzzy
izraisa atdalītu-galvas pārbaudi, nevis filiāles pārbaudi. Tāpēc jums vienkārši jāņem vērā, kagit checkout
vispirms kā filiāles nosaukumu izmantos saīsināto nosaukumu: tā jūs pārbaudīsiet filiālixyzzy
pat tad, ja pastāv birkaxyzzy
. Ja vēlaties pārbaudīt birku, varat izmantotrefs/tags/xyzzy
.) Tā kā (kā atzīmēgitrevisions
) Git mēģināsrefs/name
, jūs varat arī vienkārši rakstīttags/xyzzy
, lai identificētu nodošanu ar birkuxyzzy
. (Ja kādam ir izdevies ierakstīt derīgu atsauci ar nosaukumuxyzzy
datubāzē$GIT_DIR
, tā tiks atrisināta kā$GIT_DIR/xyzzy
. Bet parasti$GIT_DIR
ir jābūt tikai dažādiem*HEAD
nosaukumiem.)1Labi, labi, "ne tikai tāpēc, lai būtu pedantisks". :-) 2Daži teiktu "ļoti nelietderīgi", un es, patiesībā, tam piekrītu. 3Būtībā
git fetch
un visa tālvadības un refspecs koncepcija bija nedaudz novēlots papildinājums Git, kas radās aptuveni Git 1.5 laikā. Pirms tam bija tikai daži ad-hoc īpaši gadījumi, un viens no tiem bija tagu iegūšana, tāpēc tas tika iekļauts ar īpašu kodu. 4Ja tas palīdz, domājiet par attālināto Git kā par flasher slengā.Lai iegūtu konkrētu tag kodu, mēģiniet izveidot jaunu filiāli, pievienojiet tajā tag kodu. Es to izdarīju ar komandu:
$git checkout -b newBranchName tagName
.