Ar „Git“ kabliukas automatiškai prideda failus prie įsipareigojimo?

Norėčiau pridėti automatiškai generuojamą failą į tą patį įvykį, naudodamas „Git“ prieš arba po įsipareigojimo kablys, priklausomai nuo failų, kurie buvo pakeisti šiame įvykyje. Kaip tai padaryti?

Aš bandžiau jį kaip kabliuką su priešdėliu, bet ne sėkmės:

 #!/bin/sh files=`git diff --cached --name-status` re="<files of importance>" if [[ $files =~ $re ]] then echo "Creating files" exec bundle exec create_my_files exec git add my_files exec git commit --amend -C HEAD fi 

Tai sėkmingai prideda juos į saugyklą, tačiau neprideda jų prie įsipareigojimo. Aš taip pat bandžiau naudoti paskutines dvi „exec“ eilutes post-įsipareigojimų bloke kartu su išankstiniu patikrinimu, bet nieko gero.

42
19 июля '10 в 22:24 2010-07-19 22:24 Ian Terrell paklausė liepos 19 d. 10 val. 10:24 val. 2010-07-19 22:24
@ 10 atsakymų

Tai leidžia jums daryti tai, ko norite, per pertraukas. Mes darome kažką panašaus į Heroku diegimą (kompiliuojant coffeescript į javascript). Priežastis, kodėl jūsų scenarijus neveikia, yra tai, kad neteisingai naudojote exec komandą.

Puslapyje:

Įdiegtas „exec“ naudojamas pakeisti dabartinį apvalkalo procesą su nauja komanda. Sėkmingai užbaigus, exec niekada negrįžta. exec negali būti naudojamas dujotiekio viduje.

Vykdoma tik pirmoji komanda. Po to jūsų scenarijus iš esmės baigiasi.

Pabandykite kažką panašaus pabandyti (kaip kabliukas su prefiksu):

 #!/bin/sh files=`git diff --cached --name-status` re="<files of importance>" if [[ $files =~ $re ]] then echo "Creating files" bundle exec create_my_files git add my_files fi 
26
19 окт. Atsakymą pateikė Jim Garvin spalio 19 d. 2010-10-19 22:14 '10 10:14 val. 2010-10-19 22:14

Kadangi „git add“ taip pat neveikė mano išankstinio įsipareigojimo, aš vadovavau .commit rinkmenos naudojimui ir procesui suskirstyti į išankstinį ir pokalbį.

Štai keletas kodų, kurie turėtų būti lengvai suprantami.

Iš anksto įsipareigojus:

  • Bakstelėkite .commit failą arba kitą. (būtinai pridėkite jį prie .gitignore)
 #!/bin/sh echo touch .commit exit 

Po įsipareigojimo:

Jei .commit egzistuoja, žinote, kad įvykis buvo įvykdytas, tačiau įsipareigojimas dar nepradėtas. Taigi čia galite padaryti savo kodo generavimą. Taip pat patikrinkite, ar nėra .commit ir ar yra:

  • pridėti failus
  • įsipareigoti --amend -C HEAD - nepatvirtinti (neįtraukti kilpos)
  • ištrinti .commit failą
 #!/bin/sh echo if [ -a .commit ] then rm .commit git add yourfile git commit --amend -C HEAD --no-verify fi exit 

Tikimės, kad tai padės žmonėms, turintiems mažai žinių apie „bash“, lengviau laikytis ženklinimo idėjos.

26
09 окт. atsakymas pateikiamas bitluck 09 oct. 2012-10-09 17:44 '12, 17:44, 2012-10-09 17:44

Galite naudoti scenarijų derinimo ir paskelbimo scenarijų derinį.

Iš anksto įsipareigojus:

  • Bakstelėkite .commit failą arba kitą. (būtinai pridėkite jį prie .gitignore)

Po įsipareigojimo:

Jei .commit egzistuoja, žinote, kad įvykis buvo įvykdytas, tačiau įsipareigojimas dar nepradėtas. Taigi čia galite padaryti savo kodo generavimą. Taip pat patikrinkite, ar nėra .commit ir ar yra:

  • pridėti failus
  • padaryti --ammend -C HEAD --no-patikrinti (ištrinti kilpą)
  • ištrinti .commit failą

Tai yra procesas, kurį naudoju .metadata failo saugojimui iš metastoriaus sukurtoje saugykloje.

Jei kas nors žino geriausią būdą, aš visi ausis, bet dabar jis veikia.

5
16 апр. atsakymas duotas Mark 16 Bal 2012-04-16 23:14 '12 11:14 PM 2012-04-16 23:14
 #!/bin/sh # # .git/hooks/pre-commit # git add file.xyz 

Jis puikiai dirbo man. Tai bus dabartinio įsipareigojimo dalis.

git version 1.7.12.4 (Apple Git-37)

4
14 февр. Atsakymas pateikiamas 14 vasario 14 d. 2013-02-14 15:03 '13, 15:03, 2013-02-14 15:03

Kaip apie sukurtą scenarijų, kuris generuoja jūsų failus, kūrimą, o tada atlikite (kažkas eilutėse) git add my_files; git commit --amend git add my_files; git commit --amend .

1
19 июля '10 в 23:31 2010-07-19 23:31 atsakymą pateikė „ rfunduk“ liepos 19 d. 10 val. 23:31 2010-07-19 23:31

Galite naudoti update-index :

git update-index --add my_files

1
19 июля '10 в 22:26 2010-07-19 22:26 atsakymą pateikė „ rfunduk“ liepos 19 d., 10 val. 10:26 pm 2010-07-19 22:26

Jei failai generuojami automatiškai ir jie gali būti generuojami bet kurioje vietoje (tai reiškia, kad norite sukurti juos „Git“ iš anksto), pirmiausia neturėtumėte juos valdyti. Turėtumėte valdyti tik šaltinio failus. Sukurti failai turėtų būti sukurti kaip kūrimo scenarijų dalis.

Vienintelė priežastis, kodėl sukurtas failas turi būti įdėtas į pradinę valdiklį, yra tai, kai jai reikia sukurti unikalius / privilegijuotus išteklius (pvz., Licencijuotą programą), arba tam reikia daug laiko.

Pridėta

http://git-scm.com/docs/githooks :

išankstinis įsipareigojimas Šis kablys vadinamas git'u ir gali būti apeinamas su --no-check. Jis neatlieka jokių parametrų ir yra vadinamas prieš gaunant siūlomą pranešimą, įsipareigojantį žurnalą ir įsipareigoti. Iš šio scenarijaus išėjimo su nuliniu statusu Git įsipareigoja nutraukti.

Numatytasis prefikso raktas, kai jis įjungtas, užfiksuoja linijų įterpimą su tarpinėmis ir pertraukomis, fiksavimą, kai tokia eilutė randama.

Visi „Git“ priskyrimo kabliai vadinami GIT su GIT_EDITOR = aplinkos kintamuoju: jei komanda neskambina redaktoriui, kad pakeistų įsipareigojimo pranešimą.

Išankstinio fiksavimo kablio paskirtis yra patikrinti darbo zonos ir fiksuoto turinio būklės patikrinimą prieš tai. Bandymas pakeisti įsipareigojimo turinį neveiks.

Mano rekomendacija pridėtų du žingsnius prie jūsų kūrimo scenarijų: (1) žingsnis, kuriame bus sukurti visi pasenę failai, kurie bus sukurti (ir pridedami prie darbo vietos), ir (2) žingsnis, kuriuo bus patikrinta, ar visi generuojami failai Atnaujinti ir grąžinti nulinės būsenos kodą. Jūsų „Git“ pasirengimo kablys turėtų paleisti antrąjį žingsnį. Jūsų kūrėjai turėtų būti išmokyti atlikti pirmąjį žingsnį.

0
19 июля '10 в 22:32 2010-07-19 22:32 atsakymą pateikė Craig Trader liepos 10 d. 10 val. 10:32 2010-07-19 22:32

Turėjau tą patį poreikį, ir šis požiūris man labai naudingas:

 #!/bin/sh files='git diff --cached --name-only' re="<files of importance>" if [[ $files =~ $re ]] then echo "Creating files" create_my_files  git add my_files fi 

kur „create_my_files“ turėtų būti vykdomi, pavyzdžiui, jei tai yra „python“ failas, galite jį atlikti kaip „python create_my_files git add my_files“

ir tai yra tiesa, jums nereikia priešdėlį, kad vėl įvykdytumėte (kuris sukurtų begalinį nemalonų ciklą: p)

0
10 янв. atsakymas suteiktas Hassekui 10 sausio. 2012-01-10 03:57 '12 at 3:57 2012-01-10 03:57

Taip, galite pridėti sukurtus failus automatiškai, kai atliekate git kabliukus! Tačiau tam reikia sudėtingo scenarijaus.

Čia galite rasti problemos sprendimą. Čia ji atnaujina failo versiją su kiekvienu įvykiu, prideda naują pakeistą failą ir prireikus pataiso įsipareigojimą. Visiškai veikia: https://github.com/evandrocoan/.versioning

Tada tiesiog pakeiskite versijos failo pakeitimo algoritmą su „updateVersion.sh“ failu su savo algoritmu. Galbūt jums reikia pakeisti keletą dalykų, pvz., Pašalinti filialo apribojimą, nes scenarijus veikia tik tada, kai esate kūrimo skyriuje.

Be to, jis pakeis tik nurodytą failą, jei jis bus pristatytas. Jei failas nenustatytas, jis nieko nedarys, išskyrus įprastą / įprastą. Tiksliau sakant, jis atspausdina tai, ką daro kiekviename posūkyje.

Aš paaiškinsiu šį triuką. Tai gana sunku. Kablys-įsipareigojimas-prisijungti-kablys nustato, ar norimas failas bus įdiegtas ir įvykdytas. Po to jis sukuria vėliavos failą ir sustoja kablio-įsipareigojimo-msg-hook. Vėliau, įvykdžius, jis patikrina, ar yra vėliavos failas. Jei taip, jis pakeičia failus, kuriuos norite atlikti.

Atkreipkite dėmesį, tai sukurtų begalybės kilpą, nes jis vėl vadins kabliuko-make-msg-kablys (kaip padaryti pakeitimai). Tačiau tai neįvyksta dėl vėliavos bylos. Kai make-kötelezettség-msg-hook yra vykdomas ir randa vėliavos failą, jis „žino“, kas vyksta. Tada jis tiesiog ištrina vėliavos failą ir nesukuria jo dar kartą. Tokiu būdu jis užblokuoja bandymą pavesti atlikti sandorio komisinius.

0
21 июля '16 в 7:03 2016-07-21 07:03 atsakymą vartotojas pateikia liepos 21 d. 16 d. 07:03 2016-07-21 07:03

Aš susidūriau su ta pačia problema iš anksto įvykusio kablio. Aš redagavau vieną failą ir jį nustatiau, tačiau ji priėmė ankstesnį failą, o ne atnaujinamą failą, todėl pridedant git komandą (kaip parodyta žemiau) prie iš anksto įsipareigojimo kablio, jis nusprendė.

 git add $file 

Pastaba: $file yra pridėti failą.

Ačiū

-1
08 нояб. Saroj Kumar Moharana atsakymas lapkričio 08 d 2016-11-08 17:10 '16 at 17:10 pm 2016-11-08 17:10