Gauti konkrečius įsipareigojimus iš nuotolinio „Git“ saugyklos

Ar yra būdas gauti tik vieną konkretų įsipareigojimą iš nuotolinio „Git“ saugyklos be klonavimo mano kompiuteryje? Nuotolinio atpirkimo sandara yra visiškai tokia pati, kaip ir mano, todėl konfliktų nebus, bet aš nesuprantu, kaip tai padaryti, ir aš nenoriu klonuoti šios didžiulės saugyklos.

Aš esu naujas git, ar yra būdas?

154
14 февр. Varun Chitre yra nustatytas vasario 14 d. 2013-02-14 13:18 '13, 13:18, 2013-02-14 13:18
@ 9 atsakymai

Jūs klonuojate tik vieną kartą, taigi, jei jau turite nuotolinį saugyklų kloną, jį ištraukite dar kartą. Tiesiog nurodykite, kurį filialą norite traukti, arba pasirinkite pakeitimus ir patikrinkite norimą įsipareigojimą.

Naujos saugyklos naudojimas yra labai pigus pralaidumu, nes jis tik parsisiųs pakeitimus, kurių neturite. Pagalvokite apie gitą, atlikdami teisingą dalyką su minimalia apkrova.

„Git“ saugo viską .git aplanke. Galas negali būti paimtas ir išgelbėtas atskirai, jam reikia visų protėvių. Jie yra tarpusavyje susiję.


Jei norite sumažinti įkeltos rinkmenos dydį, galite paklausti „Git“ išgauti tik su konkrečiu filialu susijusius objektus arba padaryti:

 git fetch origin refs/heads/branch:refs/remotes/origin/branch 

Tai įkelia tik nuotolinio branch (ir tik tuos, kuriuos praleidote) įsipareigojimus ir įrašykite juos į origin/branch . Tada galite sujungti arba patikrinti.

Taip pat galite nurodyti tik SHA1 pataisą:

 git fetch origin 96de5297df870:refs/remotes/origin/foo-commit 

Tai tik įkelia nurodyto SHA-1 96de5297df870 (ir jo protėvių, kuriuos praleidote) įsipareigojimą, ir išsaugokite jį kaip (neegzistuojančią) origin/foo-commit nuotolinį filialą.

89
14 февр. CharlesB atsakymas, pateiktas vasario 14 d. 2013-02-14 13:23 '13, 13:23, 2013-02-14 13:23

Git 2.5+ (2015 m. Antrąjį ketvirtį) bus galima padaryti vieną (be visiško repo klonavimo)!

Žr. Įsipareigojimą 68ee628 Fredrik Medley ( moroten ) , 2015 m. Gegužės 21 d.
( Junio ​​C Hamano - gitster - įsipareigoti a9d3493 , 2015 m. Birželio 1 d.)

Dabar turite naują konfigūraciją (serverio pusę)

 uploadpack.allowReachableSHA1InWant 

Leiskite upload-pack priimti mėginio užklausą, kurioje prašoma, kad objektas būtų pasiekiamas iš bet kokio raginimo. Tačiau atkreipkite dėmesį, kad objekto pasiekiamumo apskaičiavimas yra brangus. Numatytasis yra false .

Su sekliu klonu deriniu ( git fetch --depth=1 ) galite paprašyti vieno t/t5516-fetch-push.sh (žr. t/t5516-fetch-push.sh :

 git fetch --depth=1 ../testrepo/.git $SHA1 git cat-file commit $SHA1 

git upload-pack “ („ git upload-pack “), kuris gali būti „ uploadpack.allowReachableSHA1InWant “), kuris nėra galo pabaigoje, jei jis pasiekiamas iš ref, naudojant „ uploadpack.allowReachableSHA1InWant konfigūracijos kintamąjį.


border=0

Visą dokumentaciją:

upload-pack : nebūtina leisti gauti pasiekiamo sha1

Naudojant „ uploadpack.allowReachableSHA1InWant konfigūracijos parametrą, nustatytą serverio pusėje, „ git fetch gali pateikti užklausą su „norima“ eilute, pavadinančia ne reklamuojamą objektą (tikriausiai buvo gauta už diapazono ribų arba po žymekliu į submodulį).
Bus apdorojami tik filialo galuose prieinami objektai, t. Y. Sujunkite reklamuojamas šakas ir šakas, paslėptas naudojant transfer.hideRefs .
Atkreipkite dėmesį, kad grįžtant, norint patikrinti prieinamumą, yra susijusios išlaidos.

Šią funkciją galima panaudoti tam tikro įsipareigojimo turiniui, kuriam žinoma sha1, nereikia klonuoti visos saugyklos, ypač jei naudojamas mažas mėginių ėmimas .

Naudingi atvejai yra, pavyzdžiui,

  • saugyklos, kuriose yra didelių failų istorijoje
  • pasirinkdami tik būtinus duomenis, kad patvirtintumėte submodulį,
  • dalydamasis „sha1“, nenurodydamas, kuris filialas jis priklauso „Gerrit“, jei manote, kad jis susijęs su įsipareigojimais, o ne su pakeitimų skaičiais.
    ( allowTipSHA1InWant atvejis jau buvo išspręstas naudojant „ allowTipSHA1InWant , nes kiekvienas „Gerrit“ keitimas turi nuorodą.)

border=0

Git 2,6 (2015 m. III ketvirtis) pagerins šį modelį.
Žr. 2bc31d1 , įsipareigokite cc118a6 (2015 m. Liepos 28 d.) Jeff King ( peff ) .
(susijungė Junio ​​C Hamano - gitster - įsipareigoti 824a0be , 2015 m. rugpjūčio 19 d.)

refs : palaikyti neigiamą transfer.hideRefs

Jei paslėpsite refs nuorodų hierarchiją, naudodami transfer.hideRefs konfigūraciją, vėliau nėra galimybės pakeisti šios konfigūracijos „rodyti“.
Šis pleistras įgyvendina „neigiamą“ konjugaciją, dėl kurios rungtynės nedelsiant pažymimos kaip nematomos, net jei kitoje rungtynėse ji bus paslėpta.
Mes pasirūpinsime, kad rungtynės būtų pritaikytos atvirkštine tvarka, kaip jie perduodami mums naudojant konfigūracijos įrangą, nes tai leidžia mums įprasta „paskutinė pergalė“ dirbti su konfigūracijos prioritetu (ir įrašais .git/config , pavyzdžiui, nepaisyti /etc/gitconfig ).

Taigi dabar galite:

 git config --system transfer.hideRefs refs/secret git config transfer.hideRefs '!refs/secret/not-so-secret' 

paslėpti visus refs/secret visose saugyklose, išskyrus vieną viešą bitą vienoje konkrečioje repo.


border=0

Git 2.7 (2015 m. Lapkričio / gruodžio mėn.) Vėl pagerės:

Žr. Įsipareigojimą 948bfa2 , įsipareigokite 00b293e (2015 m. Lapkričio 5 d.), Prisiimkite 78a766a , įsipareigokite 92cab49 , įsipareigokite 92cab49 , įsipareigokite 92cab49 (2015 m. Lapkričio 03 d.), Įsipareigokite 00b293e , įsipareigokite 00b293e (2015 m. 92cab49 , įsipareigokite 92cab49 , įsipareigokite 92cab49 (2015 m. Lapkričio 3 d.) Lucas Fleisher ( lfos ) .
Padėjėjas: Ericas Sunshine ( sunshineco ) .
( Jeff King - peff - į įsipareigojimą dbba85e , 2015 m. Lapkričio 20 d.)

config.txt : hideRefs semantikos su vardų erdvėmis dokumentavimas

Šiuo metu nėra aiškios apibrėžties, kaip transfer.hideRefs turėtų elgtis, kai nurodoma vardų erdvė.
Paaiškinkite, kad šiuo atveju „ hideRefs prefiksas atitinka atitinkamus pavadinimus. Štai kaip šiuo metu hideRefs modelis apdorojamas priimant paketą.

hideRefs: pridėti palaikymą, kad atitiktų pilnus refs

Be atskirtų nuorodų kartografavimo, dabar galite pridėti „ hideRefs šablonus, į kuriuos priskirtas pilnas (nepažymėtas) ref.
Norint atskirti atskirus ir pilnus atitikmenis, šiuose naujuose šablonuose turi būti etiketė su raundu ( ^ ).

Todėl nauji dokumentai :

 transfer.hideRefs: 

Jei naudojama vardų erdvė, prieš kiekvienos nuorodos pavadinimo vietos priešdėlį jis bus pašalintas, kol jis priskiriamas „ transfer.hideRefs modeliams.
Pvz., Jei refs/heads/master nurodyta transfer.hideRefs ir dabartinė vardų erdvė yra foo , tada refs/namespaces/foo/refs/heads/master skelbimų, bet refs/heads/master ir refs/namespaces/bar/refs/heads/master vis dar reklamuojami kaip vadinamosios „eilutės“.
Kad prieš pašalindami atitiktų nuorodas, prieš nuorodos pavadinimą pridėkite ^ . Jei derinate ! ir ^ , pirmiausia turite nurodyti ! .

81
08 июня '15 в 8:22 2015-06-08 08:22 atsakymą pateikė VonC birželio 8 d. 15 d. 8:22 2015-06-08 08:22

Aš ištraukiau per git repo:

 git pull --rebase <repo> <branch> 

Leiskite gitui ištraukti visą filialo kodą, o tada atsiunčiau atstatymą į tą, kuris mane domino.

git reset --hard <commit-hash>

Tikiuosi, kad tai padės.

54
03 дек. Atsakymą pateikė Piu Sharma, gruodžio 3 d. 2013-12-03 15:43 '13, 15:43, 2013-12-03 15:43

Jūs galite tiesiog gauti vieną nuotolinį atpirkimą, naudodami

 git fetch <repo> <commit> 

kur

  • <repo> gali būti nuotolinis atpirkimo pavadinimas (pvz., origin ) arba netgi nuotolinis atpirkimo URL (pvz., https://git.foo.com/myrepo.git )
  • <commit> galima perduoti SHA1

Pavyzdžiui

 git fetch https://git.foo.com/myrepo.git 0a071603d87e0b89738599c160583a19a6d95545 

gavę fiksaciją (ir trūkstamus protėvius), galite tiesiog jį patikrinti

 git checkout FETCH_HEAD 

Atkreipkite dėmesį, kad tai paskatins jus į „atjungtą galvą“.

40
06 июня '14 в 17:50 2014-06-06 17:50 atsakymas pateikiamas „ Flow“ birželio 6 d., 14 val. 17:50 2014-06-06 17:50

Galite tiesiog gauti nuotolinį atpirkimą su:

 git fetch <repo> 

kur

  • <repo> gali būti nuotolinis atpirkimo pavadinimas (pvz., origin ) arba netgi nuotolinis atpirkimo URL (pvz., https://git.foo.com/myrepo.git )

pavyzdžiui:

 git fetch https://git.foo.com/myrepo.git 

ištraukę repozicijas, galite sujungti atliktus įsipareigojimus (nes klausimas yra išskirti vieną įvykį, o vietoj susiliejimo galite naudoti tik vyšnių pasirinkimą, kad pasirinktumėte tik vieną įvykį):

 git merge <commit> 
  • <commit> galima perduoti SHA1

pavyzdžiui:

 git cherry-pick 0a071603d87e0b89738599c160583a19a6d95545 

arba

 git merge 0a071603d87e0b89738599c160583a19a6d95545 

Jei tai yra paskutinis įvykis, kurį norite sujungti, taip pat galite naudoti FETCH_HEAD kintamąjį:

 git cherry-pick (or merge) FETCH_HEAD 
11
16 июля '15 в 20:32 2015-07-16 20:32 atsakymą Sérgio pateikė liepos 15 d. 15 val. 20:32 2015-07-16 20:32

Galiausiai, aš rasiu būdą, kaip klonuoti tam tikrą įvykį, naudojant git cherry pick . Darant prielaidą, kad vietiniame tinkle neturite jokios saugyklos, ir jūs atliekate tam tikrą įsipareigojimą iš nuotolinio tinklo,

1) sukurti tuščią saugyklą vietos ir git init

2) git nuotolinio šaltinio „saugykla“

3) git fetch origin [tai neperkels jūsų failų į vietinę darbo erdvę, jei nebus sujungta]

4) „ git cherry-pick “ „Enter-long-įsipareigojimų-hash-that-you-need“

Padaryta. Tokiu būdu jūs turėsite tik failus iš šio konkretaus įvykio vietiniame.

Įveskite ilgą laiką fiksuotą maišą:

Galite naudoti šį → git log --pretty = oneline

2
03 янв. atsakymas duotas surya deepak 03 jan. 2017-01-03 07:19 '17 at 7:19 2017-01-03 07:19

Manau, kad „git ls-remote“ ( http://git-scm.com/docs/git-ls-remote ) turėtų daryti tai, ko norite. Be priverstinio ištraukimo ar įtampos.

1
28 янв. Hubbitus atsakymas yra sausio 28 d 2015-01-28 18:42 '15, 18:42 2015-01-28 18:42

1 veiksmas: pasirinkite įsipareigojimų sąrašą:

git žurnalas

Gausite sąrašą, kaip ir šiame pavyzdyje:

įsipareigoti 7244ab27d1c3411cdb8c0111706a4f0cd1236ce1 (įsipareigoti maišyti) Autorius: aspmac Data: nuo gegužės 4 d. 18:03:40 2017 +0530

 Fix header in ios(In-progress). 

Tai paskutinis įvykio pranešimas

įsipareigoti b586ed0f5fd6b89a73b632181774464ef1c37bd5 (įvykdyti maišos) Autorius: Autorius Data: penktadienis gegužės 3 d. 11:44:28 2017 +0530

 remove all console. 

Tai yra ankstesnis pranešimo pranešimas.

... 2 veiksmas: nukopijuokite reikiamą maišelį ir įklijuokite jį, kad patikrintumėte:

git checkout b586ed0f5fd6b89a73b632181774464ef1c37bd5

0
04 мая '17 в 17:16 2017-05-04 17:16 atsakymas duotas Rahi.Shah 04 Gegužės 17 d. 17:16 2017-05-04 17:16

Jei norite, pridėkite visus „Sergio“ įrašus. Sprendimas buvo apsvarstytas jo atsakyme. Manau, kad tai veikia, jei iš bet kokio atpirkimo ištraukiate bet kokį fiksavimą.

Seka:

 git init git fetch <repo> git merge <commitSHA> git push 

Čia jis yra:

 git init git fetch https://github.com/github/octicons.git git merge 8fc17d58e75d9711fcd7f51a158f93ce9076cb23 git push 
-4
27 окт. Hien atsakymas 27 okt. 2015-10-27 06:01 '15, 06:01 am 2015-10-27 06:01

Kiti klausimai apie žymes arba Užduoti klausimą