További
Mi az a git tag, Hogyan hozzunk létre címkéket & Hogyan lehet a git távoli tag(s) ellenőrzését elvégezni?
amikor a távoli git taget ellenőrzöm, ilyen parancsot használok:
git checkout -b local_branch_name origin/remote_tag_name
A következő hibát kaptam:
error: pathspec `origin/remote_tag_name` did not match any file(s) known to git.
Megtalálom a remote_tag_name-t, amikor a git tag parancsot használom.
467
3
Kezdjük azzal, hogy elmagyarázzuk, mi is az a tag a gitben.
Nem leszel képes a címkék ellenőrzésére, ha nem lesz lokálisan az adattáradban, így először is, a címkéket a helyi adattáradba kell
behoznod
.Először győződj meg róla, hogy a címke létezik-e helyben, a következő módon
Aztán ellenőrizze a címkét a
A
origin
helyett használd atags/
előtagot.Ebben a mintában 2 címke van 1.0 & 1.1 verziójú, a következők bármelyikével ellenőrizheti őket:
A fentiek mindegyike ugyanazt fogja csinálni, mivel a tag csak egy mutató az adott commitra.
Hogyan láthatjuk az összes címke listáját?
Hogyan hozzunk létre címkéket?
A címkék létrehozásának 2 módja van:
A különbség a 2 között az, hogy a megjegyzésekkel ellátott tag létrehozásakor ugyanúgy hozzáadhatsz metaadatokat, mint egy git commitban:
név, e-mail, dátum, megjegyzés & aláírás.
Hogyan lehet törölni a címkéket?
Hogyan klónozhatok egy adott címkét?
Egy adott tag tartalmának megragadásához használhatod a
checkout
parancsot.Ahogy fentebb már elmagyaráztuk, a címkék ugyanolyanok, mint bármely más commit, így használhatjuk a
checkout
parancsot, és az SHA-1 helyett egyszerűen kicserélhetjük a tag_name-ra.1. lehetőség:
2. lehetőség:
A clone parancs használata
Mivel a git támogatja a shallow clone-t, a
--branch
hozzáadásával a clone parancshoz a tag nevét használhatjuk az ág neve helyett. A Git tudja, hogyan kell "lefordítani" a megadott SHA-1-et a megfelelő commitra.Hogyan lehet címkéket tolni?
**
git push --tags
Az összes címke pusholása:
A megjegyzésekkel ellátott címkék és az aktuális előzménylánc-címkék tologatásához használja a következőt::
**
git push --follow-tags
Ez a flag
---follow-tags
mind a commits, mind pedig a only tags, amelyek mindkettő:A Git 2.4-től a konfigurációval beállítható
(Ennek a válasznak a megírása eltartott egy darabig, és codeWizard's válasz célja és lényege helyes, de nem teljesen teljes, ezért ezt mindenképpen közzéteszem.)
Nem létezik olyan, hogy "távoli Git tag". Csak "címkék" vannak. Mindezt nem azért mondom el, hogy pedáns legyek,1 hanem azért, mert az alkalmi Git-felhasználók körében nagy a zűrzavar ezzel kapcsolatban, és a Git dokumentációja nem túl hasznos2 a kezdők számára. (Nem világos, hogy a zavar a rossz dokumentáció miatt van-e, vagy a rossz dokumentáció azért van, mert ez eleve kissé zavaros, vagy mi.) Léteznek "távoli ágak", helyesebben "távoli nyomon követő ágak", de érdemes megjegyezni, hogy ezek valójában helyi entitások. Távoli címkék viszont nincsenek (hacsak nem (újra)találod őket). Csak helyi címkék léteznek, tehát a címkét helyileg kell megszerezned ahhoz, hogy használni tudd. A konkrét commitok nevének általános formája - amit a Git referenciáknak nevez - bármelyik
refs/
kezdetű karakterlánc. Arefs/heads/
-vel kezdődő string egy ágat nevez el; arefs/remotes/
-vel kezdődő string egy távoli követést végző ágat; arefs/tags/
-vel kezdődő string pedig egy taget. Arefs/stash
név a tárolóhivatkozás (ahogyan agit stash
használja; figyeljük meg, hogy hiányzik a záróvessző). Van néhány szokatlan speciális esetű név, amely nemrefs/
-vel kezdődik: aHEAD
,ORIG_HEAD
,MERGE_HEAD
és különösen aCHERRY_PICK_HEAD
mind olyan nevek, amelyek konkrét commitokra utalhatnak (bár aHEAD
általában egy ág nevét tartalmazza, azaz tartalmazza aref: refs/heads/branch
). De általában a hivatkozásokrefs/
-vel kezdődnek. Az egyik dolog, amit a Git tesz, hogy ez zavarossá tegye, hogy lehetővé teszi arefs/
elhagyását, és gyakran arefs/
utáni szót is. Például kihagyhatod arefs/heads/
vagy arefs/tags/
szót, amikor egy helyi ágra vagy tagre hivatkozol - és valójában kell kihagynod arefs/heads/
szót, amikor egy helyi ágat ellenőrzöl! Ezt akkor teheted meg, ha az eredmény egyértelmű, vagy - ahogy az imént megjegyeztük - ha muszáj megtenned (agit checkout branch
esetében). Igaz, hogy a hivatkozások nem csak a saját tárolódban léteznek, hanem távoli tárolókban is. A Git azonban csak nagyon meghatározott időpontokban ad hozzáférést egy távoli tárolóhoz'a referenciákhoz: nevezetesen afetch
éspush
műveletek során. Agit ls-remote
vagy agit remote show
segítségével is láthatod őket, de afetch
és apush
az érdekesebb érintkezési pontok.Refspecs
A
fetch
éspush
műveletek során a Git refspecs-nek nevezett karakterláncokat használ a helyi és a távoli tároló közötti referenciák átvitelére. Így ezekben az időpontokban, és a refspecsek segítségével két Git-tárhely szinkronizálódhat egymással. Ha a nevek szinkronban vannak, akkor ugyanazt a nevet használhatod, amit valaki a távolival használ. Van itt azonban némi különleges varázslat afetch
-nél, és ez mind az ágnevekre, mind a tagnevekre hatással van. Agit fetch
-re úgy kell gondolnod, hogy a Git-ed arra utasítja, hogy hívjon fel (vagy esetleg küldjön szöveges üzenetet) egy másik Git-et - a "távoli"-t - és beszélgessen vele. A beszélgetés elején a távoli rendszer felsorolja az összes referenciáját: mindent, ami arefs/heads/
-ben és mindent, ami arefs/tags/
-ben van, valamint minden más referenciát, amivel rendelkezik. A Gited átnézi ezeket, és (a szokásos fetch refspec alapján) átnevezi az águkat. Nézzük meg aorigin
nevű távolira vonatkozó normál refspec-et:Ez a refspec utasítja a Git-et, hogy vegyen minden olyan nevet, amelyik megfelel a
refs/heads/*
- azaz minden ágat a távoliban- és változtassa meg a nevétrefs/remotes/origin/*
-re, azaz tartsa meg az illeszkedő részt, az ág nevét (refs/heads/
) változtassa meg egy távoli nyomon követhető ág nevére (refs/remotes/
, konkrétanrefs/remotes/origin/
). Ez ezen refspec révén lesz aorigin
'ágakból a távoliorigin
távoli követési ága. Az ágnév a távkövető ág nevévé válik, a távoli, ebben az esetben aorigin
nevével együtt. A refspec elején lévő+
pluszjel a "force" jelzőt állítja be, azaz a távkövető ágad úgy frissül, hogy megfeleljen a távoli ág nevének, függetlenül attól, hogy mit kell tenned, hogy megfeleljen. (A+
nélkül az ágak frissítései a "gyors továbbítás" módosításokra korlátozódnak, és a címkék frissítéseit a Git 1.8.2-es verziója óta egyszerűen figyelmen kívül hagyja - előtte ugyanezek a gyors továbbítási szabályok voltak érvényben).Címkék
De mi a helyzet a címkékkel? Nincsenek refspec-ek - legalábbis alapértelmezés szerint nem. Beállíthatsz egyet, ebben az esetben a refspec formája rajtad múlik; vagy futtathatod a
git fetch --tags
parancsot. A--tags
használata azt eredményezi, hogy a refspec-hez hozzáadjuk arefs/tags/*:refs/tags/*
-t, azaz, átviszi az összes címkét (de nem frissíti a te címkéidet, ha már van egy ilyen nevű címkéd, függetlenül attól, hogy a távoli címke mit mond Szerkesztés, 2017. január: a Git 2-től.10, a tesztelés azt mutatja, hogy a--tags
erőszakkal frissíti a te címkédet a távoli's címkékből, mintha a refspec+refs/tags/*:refs/tags/*
lenne; ez lehet, hogy a Git egy korábbi verziójához képest eltérő viselkedés). Vedd figyelembe, hogy itt nincs átnevezés: ha a távoliorigin
-ben vanxyzzy
tag, és neked nincs, és tegit fetch origin "refs/tags/*:refs/tags/*"
, akkor arefs/tags/xyzzy
hozzáadódik a te tárolódhoz (ugyanarra a commitra mutatva, mint a távoliban). Ha a+refs/tags/*:refs/tags/*
-t használod, akkor axyzzy
címke, ha van, *helyettesítve lesz aorigin
címkéjével. Vagyis a+
force flag egy refspec-en azt jelenti, hogy "cseréld le a hivatkozásom'értékét arra, amit a Git-em a saját Git-jéből kap".Automatikus címkék a lekérdezés során
Történelmi okokból,3 ha nem használod sem a
--tags
opciót, sem a--no-tags
opciót, agit fetch
különleges lépéseket tesz. Emlékezz, hogy fentebb azt mondtuk, hogy a távoli azzal kezdi, hogy a helyi Gitednek minden hivatkozását megjeleníti, függetlenül attól, hogy a helyi Gited látni akarja-e őket vagy sem.4 A Gited ezen a ponton megjegyzi az összes taget, amit lát. Ezután, amikor elkezdi letölteni az összes commit objektumot, amire szüksége van ahhoz, hogy kezelje, amit lekérdez, ha az egyik ilyen commitnak ugyanaz az azonosítója, mint bármelyik címkének, akkor a git hozzáadja azt a taget - vagy ezeket a címkéket, ha több tagnek is megvan ez az azonosítója - a tárolódhoz. Szerkesztés, 2017. január: a tesztelés azt mutatja, hogy a viselkedés a Git 2.10-ben most: Ha az ő Gitjük biztosít egy T nevű taget, és neked nincs T nevű taged, és a T-hez tartozó commit ID egy őse az egyik águknak, amit agit fetch
vizsgál, akkor a Gited hozzáadja T-t a tagjeidhez--tagekkel
vagy anélkül. A--tags
hozzáadásával a Gited minden címkéjüket megszerzi, és a frissítést is kikényszeríti.Bottom line
Lehet, hogy a
git fetch --tags
-t kell használnod, hogy megkapd a címkéiket. Ha a címkenevek ütköznek a meglévő címkenevekkel, lehet (a Git verziójától függően) még törölnöd (vagy átnevezned) is kell néhány címkét, majd futtatnod agit fetch --tags
-t, hogy megkapd a címkéiket. Mivel a címkék - a távoli ágakkal ellentétben - nem rendelkeznek automatikus átnevezéssel, a címkék nevének meg kell egyeznie az ő címkéik nevével, ezért lehetnek konfliktusos problémák. A többnyire normális esetekben azonban egy egyszerűgit fetch
elvégzi a munkát, átveszi a commitjaikat és a hozzájuk tartozó címkéket, és mivel ők - bárkik is legyenek azok - a commitokat akkor címkézik, amikor publikálják azokat, te is lépést tartasz a címkékkel. Ha nem készítesz saját címkéket, és nem kevered a repositoryjukat más repositorykkal (több távoli elérésen keresztül), akkor nem lesznek címke név ütközések sem, így nem kell a címkék törlésével vagy átnevezésével bajlódnod ahhoz, hogy megkapd a címkéiket.Ha minősített nevekre van szüksége
Fentebb említettem, hogy a
refs/
szinte mindig elhagyható, arefs/heads/
ésrefs/tags/
és így tovább pedig a legtöbbször. De mikor nem lehet? A teljes (vagy legalábbis majdnem teljes) választ agitrevisions
dokumentációban találod. A Git a linkben megadott hat lépésből álló szekvencia segítségével oldja fel a nevet commit azonosítóra. Érdekes módon a címkék felülírják az ágakat: ha van egyxyzzy
címke és egyxyzzy
ág, és ezek különböző commitokra mutatnak, akkor:megadja azt az azonosítót, amelyre a tag mutat. Azonban - és ez az, ami hiányzik a
gitrevisions
-ból - agit checkout
az ágneveket részesíti előnyben, így agit checkout xyzzy
az ágra fog helyezni, figyelmen kívül hagyva a taget. Kétértelműség esetén szinte mindig kiírhatod a ref nevét a teljes nevével,refs/heads/xyzzy
vagyrefs/tags/xyzzy
. (Megjegyzendő, hogy ez működik agit checkout
tal, de talán váratlan módon: Agit checkout refs/heads/xyzzy
inkább egy detached-HEAD checkoutot okoz, mint egy branch checkoutot. Ezért csak azt kell megjegyezned, hogy agit checkout
először a rövid nevet fogja ágnévként használni: így'így checked ki azxyzzy
ágat akkor is, ha axyzzy
tag létezik. Ha ki akarod csekkolni a taget, használhatod arefs/tags/xyzzy
-t). Mivel (ahogy agitrevisions
megjegyzi) a Git megpróbálja arefs/name
, egyszerűen írhatod atags/xyzzy
-t is axyzzy
címkével ellátott commit azonosítására. (Ha azonban valakinek sikerült egyxyzzy
nevű érvényes hivatkozást írnia a$GIT_DIR
-be, akkor ez$GIT_DIR/xyzzy
-ként fog feloldódni. Normális esetben azonban csak a különböző*HEAD
neveknek kellene a$GIT_DIR
-ben lenniük.)1Oké, oké, "nem csak azért, hogy pedáns legyek" :-) 2Egyesek szerint "nagyon nem segítőkész", és én inkább egyetértenék vele. 3Alapvetően a
git fetch
, és a remotes és refspecs egész koncepciója egy kicsit későn került a Git-be, a Git 1.5 körül történt. Előtte csak néhány ad-hoc speciális eset volt, és a tag-fetching volt az egyik ilyen, így speciális kóddal került be a rendszerbe. 4Ha ez segít, gondolj a távoli Gitre úgy, mint egy flasher, szleng értelemben.Az adott címkekód megszerzéséhez próbáljon meg létrehozni egy új ágat, és adja hozzá a címkekódot. Ezt a következő paranccsal csináltam:
$git checkout -b newBranchName tagName
.