„Git“ - skirtumas tarp „prisiimti nepakeistą“ ir „skip-worktree“

Turiu vietinių failo pakeitimų, kurių nenoriu nustatyti savo saugykloje. Tai yra konfigūracijos failas, skirtas programai sukurti serveryje, tačiau noriu jį sukurti vietoje su įvairiais nustatymais. Natūralu, kad failas visada rodomas, kai darau „git statusą“ kaip kažką įdėti. Norėčiau paslėpti šį konkretų pakeitimą, o ne padaryti jį. Neištaisysiu failo pakeitimų.

Po kai kurių kasimo, matau 2 parinktis: „prisiimti-be pakeitimo“ ir „skip-worktree“. Ankstesnis klausimas čia kalbamas apie juos, bet iš tikrųjų jų skirtumai nėra aiškinami. Mano klausimas yra toks: kaip dvi komandos skiriasi? Kodėl kas nors tai naudoja?

285
29 нояб. ckb nustatė lapkričio 29 d. 2012-11-29 20:00 '12 20:00 val. 2012-11-29 20:00
@ 2 atsakymai

Norite skip-worktree .

assume-unchanged skirta tais atvejais, kai verta patikrinti, ar pasikeitė failų grupė; kai nustatote šiek tiek, git (žinoma) daro prielaidą, kad failai, atitinkantys šią indekso dalį, darbo kopijoje nepasikeitė. Tokiu būdu vengiama painiavos dėl stat skambučių. Šis bitas prarandamas, kai indekso failo įrašas pasikeičia (todėl, kai failas keičiamas prieš srovę).

skip-worktree daugiau: net jei „ git žino, kad failas buvo pakeistas (arba jį reikia keisti naudojant „ reset --hard ar pan.), jis apsimeta, kad jis nenaudojo indekso versijos. Tai palaikoma tol, kol indeksas bus sumažintas.

Čia yra gera šios skirtumo ir tipiškų naudojimo atvejų santrauka: http://fallengamer.livejournal.com/93321.html .

Iš šio straipsnio:

  • --assume-unchanged reiškia, kad kūrėjas neturėtų keisti failo. Ši vėliava skirta pagerinti nepakeistų aplankų, pvz., SDK, našumą .
  • --skip-worktree yra naudinga, kai pasakysite „git“, kad nelieskite konkretaus failo, kai kūrėjams reikia jį keisti. Pvz., Jei viršutinės konfigūracijos failai yra įdedami į pagrindinę saugyklą , ir nenorite netyčia keisti šių failų, --skip-worktree yra būtent tai, ko norite.
422
29 нояб. atsakymas pateikiamas Borealid Nov 29 2012-11-29 20:39 '12, 08:39 pm 2012-11-29 20:39

Pastaba: 2011 m. „ Fallengamer“ atliko keletą bandymų (todėl jie gali būti pasenę) ir čia pateikiamos išvados :

operacijas

  • Failas keičiamas tiek vietinėje saugykloje, tiek viršutiniame sraute.
    git pull :
    Bet kuriuo atveju „Git“ taupo vietinius pokyčius.
    Taigi netyčia nepraranda duomenų, pažymėtų bet kuria vėliava.
    • Failas su assume-unchanged : „Git“ neperkels vietinio failo. Vietoj to jis rodo konfliktus ir patarimus, kaip juos išspręsti.
    • Failas su skip-worktree : „Git“ nepakeičia vietos failo. Vietoj to jis rodo konfliktus ir patarimus, kaip juos išspręsti.

,

border=0
  • Failas keičiamas tiek vietinėje saugykloje, tiek viršutiniame kurse, bet kuriuo atveju bandant
    git stash
    git pull
    Naudojant skip-worktree atsiranda papildomų rankinio darbo, bet bent jau neprarasite jokių duomenų, jei pasikeitė vietos.
    • Failas su vėliava „Be assume-unchanged : panaikina visus vietinius pakeitimus be galimybės juos atkurti. Poveikis yra panašus į„ git reset --hard . „ git pull call“ bus sėkmingas
    • skip-worktree vėliavos skip-worktree : „Stash“ neveiks su skip-worktree . „ git pull veiks su ta pačia klaida kaip ir anksčiau. Kūrėjas turi rankiniu būdu atstatyti skip-worktree vėliavą, kad būtų galima išsaugoti ir užbaigti nepatenkinamą pull .

,

border=0
  • Vietinių pakeitimų nėra, failas „upstream“ nekeičiamas.
    git pull
    Abi vėliavos netrukdė jums gauti didėjančių pokyčių. „Git“ nustato, kad pažeisite assume-unchanged pažadą ir ketinate vėliavą atsisakyti.
    • Failas su vėliava „ assume-unchanged : turinys atnaujinamas, vėliava prarandama.
      git ls-files -v parodys, kad vėliava bus pakeista į H (nuo h ).
    • Failas su skip-worktree : turinys atnaujinamas, vėliavėlė išsaugoma.
      git ls-files -v “ parodys tą pačią „ S vėliavą kaip ir anksčiau.

,

border=0
  • Pakeitus vietinį failą
    git reset --hard
    „Git“ nesusijęs su skip-worktree ir atspindi tikrovę (failas, pažadėtas be pakeitimų, faktiškai pasikeitė), kad failas būtų assume-unchanged .
    • Failas su vėliava „ assume-unchanged : failo turinys grąžinamas. Vėliava iš naujo nustatoma į H (nuo h ).
    • skip-worktree flag skip-worktree : failo turinys yra nepažeistas. Vėliava lieka tokia pati.

Jis priduria šią analizę:

  • Atrodo, kad „ skip-worktree stengiasi išsaugoti vietinius duomenis . Tačiau tai neužkerta kelio gauti didėjančius pokyčius, jei jie yra saugūs. Be to, „git“ vėl neišsiunčia vėliavos.
    Tačiau ignoruojant reset --hardreset --hard “, reset --hard gali būti nemalonus siurprizas .

  • Assume-unchanged vėliavos gali būti prarastos pull operacijos metu ir vietiniai pakeitimai tokiuose failuose neatrodo svarbūs.

Norėdami pamatyti:

Jis daro išvadą:

Iš tiesų, nė viena vėliava nėra gana intuityvi .

  • assume-unchanged prielaida, kad kūrėjas neturėtų keisti failo. Jei failas pakeistas - tai nesvarbu. Ši vėliava skirta pagerinti nepakeistų aplankų, pvz., SDK, našumą.
    Bet jei pažadas yra sugadintas ir failas faktiškai modifikuotas, git grąžina vėliavą, kad atspindėtų tikrovę. Tikriausiai yra normalu, kad aplankuose yra tam tikrų nenuoseklių vėliavų, kurios paprastai nekeičiamos.

  • Kita vertus, „ skip-worktree yra naudinga, kai skip-worktree , kad „git“ nepaliesti konkretaus failo. Tai naudinga jau stebimam konfigūracijos failui.
    Pagrindiniame Upstream saugykloje yra parengta konfigūracija, tačiau norite pakeisti kai kuriuos konfigūracijos nustatymus, kad galėtumėte atlikti vietinius testus. Ir nenorite atsitiktinai patikrinti tokio failo pakeitimų, kad paveiktų gamybos konfigūraciją. Šiuo atveju skip-worktree sukuria puikią sceną.

69
22 мая '14 в 15:36 2014-05-22 15:36 atsakymą pateikė VonC , gegužės 22 d. 14, 15:36 2014-05-22 15:36

Kiti klausimai apie „ žymes arba „ Klauskite klausimą“