kun otan etä-Git-tunnisteen käyttöön komennolla näin:
git checkout -b local_branch_name origin/remote_tag_name
Sain tällaisen virheen:
error: pathspec `origin/remote_tag_name` did not match any file(s) known to git.
Löydän remote_tag_name kun käytän git tag komentoa.
Tagia käytetään tietyn commitin merkitsemiseen ja merkitsemiseen historiassa.
Sitä käytetään yleensä merkitsemään julkaisupisteitä (esim. v1.0 jne.).
Vaikka tunniste voi näyttää samanlaiselta kuin haara, tunniste ei kuitenkaan muutu.
Se osoittaa suoraan tiettyyn toimitukseen** historiassa.
Et voi tarkistaa tunnisteita, jos niitä ei ole paikallisesti arkistossasi, joten sinun on ensin "haettava" tunnisteet paikalliseen arkistoosi.
Varmista ensin, että tunniste on olemassa paikallisesti tekemällä
# --all will fetch all the remotes.
# --tags will fetch all tags as well
git fetch --all --tags --prune
Tarkista sitten tunniste ajamalla
git checkout tags/<tag_name> -b <branch_name>
Käytä etuliitteen origin
sijasta etuliitettä tags/
.
Tässä näytteessä on 2 tagia versio 1.0 & versio 1.1. Voit tarkistaa ne millä tahansa seuraavista:
git checkout A ...
git checkout version 1.0 ...
git checkout tags/version 1.0 ...
Kaikki edellä mainitut tekevät saman, koska tagi on vain osoitin tiettyyn commitiin.
3 alkuperä: https://backlog.com/git-tutorial/img/post/stepup/capture_stepup4_1_1.png
# list all tags
git tag
# list all tags with given pattern ex: v-
git tag --list 'v-*'
Tunnisteen luomiseen on 2 tapaa:
# lightweight tag
git tag
# annotated tag
git tag -a
Ero näiden kahden välillä on se, että luodessasi kommentoidun tunnisteen voit lisätä metatietoja kuten git-komituksessa:
nimi, sähköpostiosoite, päivämäärä, kommentti & allekirjoitus.
# delete any given tag
git tag -d <tag name>
# Don't forget to remove the deleted tag form the server with push tags
Voit napata tietyn tagin sisällön käyttämällä komentoa checkout
.
Kuten edellä selitettiin, tagit ovat kuten muutkin commits, joten voimme käyttää checkout
-komentoa ja SHA-1:n sijasta korvata sen yksinkertaisesti tag_name:lla.
Vaihtoehto 1:
# Update the local git repo with the latest tags from all remotes
git fetch --all
# checkout the specific tag
git checkout tags/<tag> -b <branch>
Vaihtoehto 2:
Koska git tukee shallow clonea lisäämällä --haara
clone-komentoon, voimme käyttää tagin nimeä haaran nimen sijaan. Git osaa "kääntää" annetun SHA-1:n kyseiseen toimitukseen.
# Clone a specific tag name using git clone
git clone <url> --branch=<tag_name>
git clone --branch=
---haara
voi myös ottaa tunnisteita ja irrottaa HEAD:n kyseisen toimituksen kohdalta tuloksena syntyvässä arkistossa.
git push --tags
**Kaikkien tunnisteiden työntäminen:
git push --tags
Jos haluat työntää kommentoituja tunnisteita ja nykyisen historian ketjun tunnisteita, käytä::
git push --follow-tags
Tämä lippu --follow-tags
työntää sekä commits että only tags, jotka ovat molemmat:
Git 2.4:stä lähtien voit asettaa sen käyttämällä konfiguraatiota
git config --global push.followTags true
Ei ole olemassa sellaista asiaa kuin "etä-Git-tunniste". On olemassa vain "tagit". Huomautan tästä kaikesta, en ole pedantti,1 vaan siksi, että satunnaiset Git-käyttäjät ovat hyvin hämmentyneitä tästä asiasta, eikä Git-dokumentaatio ole kovinkaan hyödyllinen2 aloittelijoille. (On epäselvää, johtuuko sekaannus huonosta dokumentaatiosta, vai johtuuko huono dokumentaatio siitä, että asia on luonnostaan hieman sekava, vai mistä.)
On on olemassa "etähaaroja", joita kutsutaan oikeammin "etäseurantahaaroiksi", mutta on syytä huomata, että ne ovat itse asiassa paikallisia kokonaisuuksia. Etätunnisteita ei kuitenkaan ole (ellet (keksi) niitä uudelleen). On vain paikallisia tunnisteita, joten sinun on saatava tunniste paikallisesti, jotta voit käyttää sitä.
Yleinen muoto tiettyjen kommittien nimille - joita Git kutsuu referensseiksi - on mikä tahansa merkkijono, joka alkaa refs/
:llä. Merkkijono, joka alkaa sanalla refs/heads/
, nimeää haaran; merkkijono, joka alkaa sanalla refs/remotes/
, nimeää etäseurantahaaran; ja merkkijono, joka alkaa sanalla refs/tags/
, nimeää tagin. Nimi refs/stash
on kätköviittaus (kuten git stash
käyttää; huomaa, ettei perässä ole vinoviivaa).
On joitakin epätavallisia erikoisnimiä, jotka eivät ala refs/
:llä: HEAD
, ORIG_HEAD
, MERGE_HEAD
ja erityisesti CHERRY_PICK_HEAD
ovat kaikki myös nimiä, jotka voivat viitata tiettyihin kommitteihin (vaikka HEAD
sisältää yleensä haaran nimen, eli sisältää ref: refs/heads/branch
). Mutta yleensä viittaukset alkavat refs/
:llä.
Yksi asia, jonka Git tekee tästä hämmentävää, on se, että se sallii sinun jättää refs/
pois, ja usein myös refs/
:n jälkeisen sanan. Voit esimerkiksi jättää refs/heads/
tai refs/tags/
pois, kun viittaat paikalliseen haaraan tai tagiin - ja itse asiassa sinun pitää jättää refs/heads/
pois, kun tarkastat paikallisen haaran! Voit tehdä tämän aina, kun tulos on yksiselitteinen, tai - kuten juuri totesimme - kun sinun on pakko tehdä se (for git checkout haara
).
On totta, että viitteitä on olemassa paitsi omassa arkistossasi myös etäarkistoissa. Git antaa sinulle kuitenkin pääsyn etätietovarastojen viitteisiin vain hyvin tiettyinä aikoina: nimittäin fetch
- ja push
-operaatioiden aikana. Voit myös käyttää git ls-remote
tai git remote show
nähdäksesi ne, mutta fetch
ja push
ovat mielenkiintoisempia kosketuskohtia.
fetch
- ja push
-operaatioiden aikana Git käyttää merkkijonoja, joita se kutsuu refspecsiksi, siirtääkseen viittauksia paikallisen ja etätietovaraston välillä. Näin ollen juuri näinä hetkinä ja refspecsien avulla kaksi Git-tietovarastoa voi synkronoitua toistensa kanssa. Kun nimet ovat synkronoitu, voit käyttää samaa nimeä, jota joku etätietovarastossa käyttää. fetch
:ssä on kuitenkin jotain erityistä taikaa, ja se vaikuttaa sekä haarojen että tunnisteiden nimiin.
Sinun pitäisi ajatella, että git fetch
ohjaa Gittiäsi kutsumaan (tai ehkä lähettämään tekstiviestin) toisen Gitin - "remote"- ja keskustelemaan sen kanssa. Keskustelun alkuvaiheessa etäkeskus listaa kaikki viittauksensa: kaiken, mikä on refs/heads/
:ssä, ja kaiken, mikä on refs/tags/
:ssä, sekä kaikki muut viittaukset, joita sillä on. Git-ohjelmasi käy nämä läpi ja (tavanomaisen fetch refspecin perusteella) nimeää niiden oksat uudelleen.
Katsotaanpa tavallista refspeciä etäisyydelle nimeltä origin
:
$ git config --get-all remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
$
Tämä refspec käskee Gitiäsi ottamaan jokaisen nimen, joka vastaa refs/heads/*
- eli jokaisen haaran kauko-osassa - ja muuttamaan sen nimen refs/remotes/origin/*
:ksi, eli pitämään täsmäävän osan samana, muuttamalla haaran nimen (refs/heads/
) kauko-osaa jäljitteleväksi haaran nimeksi (refs/remotes/
, tarkemmin sanottuna refs/remotes/origin/
).
Tämän refspecin* kautta origin
'-haaroista tulee etäseurantahaarasi etäisen origin
:n osalta. Haaran nimestä tulee etäseurantahaaran nimi, jossa on mukana etäyhteyden, tässä tapauksessa origin
, nimi. Plus-merkki +
refspecin edessä asettaa "force" -lippulauseen, eli etäseurantahaarasi päivitetään vastaamaan etäyhteyden'haaran nimeä riippumatta siitä, mitä sen saamiseksi tarvitaan. (Ilman +
-merkkiä haara-päivitykset rajoittuvat "fast forward" -muutoksiin, ja tunnisteiden päivitykset yksinkertaisesti jätetään huomiotta Git-versiosta 1.8.2 tai noin lähtien - sitä ennen sovellettiin samoja fast forward -sääntöjä.)
Mutta entä tunnisteet? Niitä varten ei ole refspecia - ainakaan oletusarvoisesti. Voit asettaa sellaisen, jolloin refspecin muoto on sinun päätettävissäsi; tai voit suorittaa git fetch --tags
. Käyttämällä --tags
lisätään refspeciin refs/tags/*:refs/tags/*
, ts, se tuo kaikki tunnisteet (mutta ei päivitä tunnistettasi, jos sinulla on jo tunniste tällä nimellä, huolimatta siitä, mitä etätunnisteessa sanotaan Muokattu, tammikuu 2017: Git 2.10, testaaminen osoittaa, että --tags
päivittää väkisin sinun tagisi etäkäyttäjän tagien perusteella, ikään kuin refspec lukisi +refs/tags/*:refs/tags/*
; tämä voi olla ero käyttäytymisessä aikaisempaan Git-versioon verrattuna).
Huomaa, että tässä ei tapahdu uudelleennimeämistä: jos etälähteen origin
:ssä on tagi xyzzy
, mutta sinulla ei ole, ja haet git fetch origin "refs/tags/*:refs/tags/*"
, saat lisättyä repositorioosi refs/tags/xyzzy
:n (joka osoittaa samaan toimitukseen kuin etälähteessä). Jos käytät +refs/tags/*:refs/tags/*
, tagisi xyzzy
, jos sinulla on sellainen, korvataan tagilla origin
. Toisin sanoen, refspecin pakotuslippu +
tarkoittaa "korvaa viittaukseni'arvo sillä, jonka Gitini saa heidän Gitistään".
Historiallisista syistä,3 jos et käytä --tags
-valintaa etkä --no-tags
-valintaa, git fetch
ryhtyy erityistoimiin. Muista, että sanoimme edellä, että etätoiminto aloittaa näyttämällä paikalliselle Gitillesi kaikki viittaukset, halusipa paikallinen Git nähdä ne tai ei.4 Gitisi huomioi kaikki tässä vaiheessa näkemänsä tagit. Sitten, kun se alkaa ladata kaikkia commit-objekteja, joita se tarvitsee käsitelläkseen sitä, mitä se hakee, jos jollakin näistä commiteista on sama ID kuin jollakin näistä tunnisteista, git lisää kyseisen tunnisteen - tai nämä tunnisteet, jos useammalla tunnisteella on sama ID - arkistoosi.
Edit, Jan 2017: testaus osoittaa, että Git 2.10:ssä käyttäytyminen on nyt: Jos heidän Git tarjoaa tunnisteen nimeltä T, ja sinulla ei ole T-nimistä tunnistetta, ja T:hen liittyvä commit ID on esi-isä jossakin heidän haarassaan, jota git fetch
tutkii, Git lisää T:n tunnisteisiisi --tags
:n kanssa tai ilman. --tags
lisääminen saa Gitisi hankkimaan kaikki niiden tagit ja myös pakottamaan päivityksen.
Sinun on ehkä käytettävä git fetch --tags
saadaksesi niiden tagit. Jos niiden tagien nimet ovat ristiriidassa olemassa olevien tagien nimien kanssa, sinun voi (Git-versiosta riippuen) jopa joutua poistamaan (tai nimeämään uudelleen) joitakin tagejasi ja sitten ajamaan git fetch --tags
saadaksesi niiden tagit. Koska tunnisteiden - toisin kuin etähaarojen - nimeäminen ei tapahdu automaattisesti, tunnisteiden nimien on vastattava heidän tunnisteidensa nimiä, minkä vuoksi ristiriitoja voi esiintyä.
git fetch
hoitaa kuitenkin homman, tuo heidän kommitointinsa ja niihin sopivat tagit, ja koska he - keitä he sitten ovatkaan - merkitsevät kommitointeja silloin, kun he julkaisevat ne, pysyt heidän tagiensa perässä. Jos et tee omia tunnisteita etkä sekoita heidän arkistoaan ja muita arkistojaan (useiden etäyhteyksien kautta), et myöskään joudu törmäämään tunnisteiden nimiin, joten sinun ei tarvitse poistaa tai nimetä tunnisteita uudelleen saadaksesi heidän tunnisteitaan.Mainitsin edellä, että voit jättää refs/
lähes aina pois, ja refs/heads/
ja refs/tags/
ja niin edelleen useimmiten. Mutta milloin voi't?
Täydellinen (tai ainakin lähes täydellinen) vastaus on gitrevisions
-dokumentaatiossa. Git ratkaisee nimen commit-tunnukseksi käyttäen linkissä annettua kuusivaiheista järjestystä. Kummallista kyllä, tunnisteet ohittavat haarat: jos on olemassa tunniste xyzzy
ja haara xyzzy
, ja ne viittaavat eri komituksiin, niin:
git rev-parse xyzzy
gitrevisionsista
- git checkout
suosii haaran nimiä, joten git checkout xyzzy
laittaa sinut haaraan, ottamatta huomioon tagia.
Epäselvissä tapauksissa voit melkein aina kirjoittaa ref-nimen käyttämällä sen koko nimeä, refs/heads/xyzzy
tai refs/tags/xyzzy
. (Huomaa, että tämä toimii git checkout
:n kanssa, mutta ehkä odottamattomalla tavalla: git checkout refs/heads/xyzzy
aiheuttaa pikemminkin detached-HEAD checkoutin kuin branch checkoutin. Siksi sinun on vain huomioitava, että git checkout
käyttää ensin lyhyttä nimeä haaran nimenä: näin voit tarkistaa haaran xyzzy
, vaikka tagi xyzzy
olisi olemassa. Jos haluat tarkistaa tagin, voit käyttää refs/tags/xyzzy
).
Koska (kuten gitrevisions
huomauttaa) Git yrittää refs/name
, voit myös yksinkertaisesti kirjoittaa tags/xyzzy
tunnistaaksesi toimituksen, jossa on tunniste xyzzy
. (Jos joku on onnistunut kirjoittamaan $GIT_DIR
:iin $GIT_DIR
:iin xyzzy
-nimisen kelvollisen viittauksen, tämä kuitenkin ratkaisee $GIT_DIR/xyzzy
:ksi. Mutta normaalisti vain eri *HEAD
-nimien pitäisi olla $GIT_DIR
:ssä.).1Okei, okei, "ei vain ollakseni pedantti". :-)
2Jotkut sanoisivat "erittäin ei-avuliasta", ja olen itse asiassa samaa mieltä.
3Periaatteessa git fetch
, ja koko käsite remotes ja refspecs, oli hieman myöhäinen lisäys Gitiin, joka tapahtui Git 1.5:n aikoihin. Sitä ennen oli vain joitakin ad-hoc-erityistapauksia, ja tagien haku oli yksi niistä, joten se otettiin mukaan erityiskoodin avulla.
4Jos se auttaa, ajattele etä-Gitiä flasherina, slangin merkityksessä.