Tikrinimas, kas turi būti surišamas prieš tvirtinimą

Internetas yra visiškai užvaldytas neteisingais ir netobulais atsakymais į šį klausimą. Tai liūdna, nes manote, kad tai bus paprastas dalykas, kurį norėtumėte padaryti.

Problema: pradedant kablys, pre-commit saugykla gali būti ne švari. Todėl, jei jūs naiviai atliksite savo testus, jie neprieštaraus, ką darote, bet kokie nešvarumai yra jūsų darbo medyje.

Akivaizdu, ką reikia padaryti, yra git stash --keep-index --include-untrackedpre-commit git stash --keep-index --include-untracked ir git pop produkcijos pradžioje. Taigi išbandysite norimą indeksą (švarų).

Deja, tai sukuria susiliejimo konfliktų žymenis, jei naudojate „ git add --patch (ypač jei redaguojate medžioklę), nes stash@{0} turinys gali nesutapti su darbo medžiu.

Kitas bendras sprendimas - klonuoti saugyklą ir atlikti bandymus naujoje laikinajame. Yra dvi problemos: viena yra ta, kad dar to nepadarėme, todėl negalime lengvai gauti kapinyno kopijos toje valstybėje, kurią ketiname padaryti (esu tikras, kad tai galima padaryti, tačiau manęs nesidomi, nes: ). Antra, mano testai gali būti jautrūs dabartinio darbo katalogo vietai. Pavyzdžiui, dėl vietinės aplinkos konfigūracijos.

Taigi: kaip aš galiu atkurti savo darbo medį bet kokioje būsenoje, kuri egzistavo prieš git stash --keep-index --include-untracked , neįvedant sujungimo konfliktų žymeklių ir nekeičiant post-įsipareigojimų HEAD ?

13
07 сент. „pwaller “ nustatytas 07 sep . 2012-09-07 17:36 '12, 17:36, 2012-09-07 17:36
@ 5 atsakymai

„Git“ įrašų medis yra naudingas iš pre-commit kabliukams. Jis įrašo medį į atpirkimo indeksą (šis medis bus pakartotinai naudojamas, jei ir kada įvykdomas įsipareigojimas).

Kai medis rašomas į repo, galite naudoti git archive | tar -x git archive | tar -x rašo medį į laikiną katalogą.

Pavyzdžiui:

 #!/bin/bash TMPDIR=$(mktemp -d) TREE=$(git write-tree) git archive $TREE | tar -x -C $TMPDIR # Run tests in $TMPDIR RESULT=$? rm -rf "$TMPDIR" exit $RESULT 
2
02 апр. atsakymą pateikė Gary van der Merwe 2016-04-02 17:12 '16 at 17:12 pm 2016-04-02 17:12

Jei galite sau leisti naudoti laikiną katalogą (t. Y. Atlikti visą dabartinės patikros kopiją), galite naudoti laikiną katalogą, pavyzdžiui:

 tmpdir=$(mktemp -d) # Or put it wherever you like git archive HEAD | tar -xf - -C "$tmpdir" git diff --staged | patch -p1 -d "$tmpdir" cd "$tmpdir" ... 

Iš esmės tai yra „William Pursell“ sprendimas, tačiau naudojamas „ git archive , kuris kodą supaprastina, ir tikiuosi, kad jis bus greitesnis.

Arba, pirma, cd'ing:

 cd somewhere git -C path/to/repo archive HEAD | tar -xf - git -C path/to/repo diff --staged | patch -p1 ... 

git -C reikia Git 1.8.5.

2
29 мая '14 в 15:11 2014-05-29 15:11 Atsakymas pateikiamas Øsse gegužės 29 d., 14 val. 15:11 2014-05-29 15:11

Jei visų repo klonavimas yra pernelyg brangus, jums gali prireikti darbo katalogo kopijos. Kopijuoti būtų lengviau, nei bandyti spręsti konfliktus. Pavyzdžiui:

 #!/bin/sh -e trap 'rm -rf $TMPD' 0 mkdir ${TMPD=$PWD/.tmpdir} git ls-tree -r HEAD | while read mod type sha name; do if test "$type" = blob; then mkdir -p $TMPD/$( dirname "$name" ) git show $sha > $TMPD/"$name"; chmod $mod $TMPD/"$name" fi done cd $TMPD git diff --cached HEAD | patch # Run tests here 

Tai yra medžio būklės išvertimas, kaip ir po to, kai buvo nustatyta $ TMPD, todėl ten galite paleisti bandymus. Turėtumėte gauti laikiną katalogą saugiau, nei čia, bet norint, kad galutinis difraktas veiktų (arba supaprastintų scenarijų ir cd anksčiau), jis turi būti darbo katalogo vaikas.

2
09 сент. atsakymą pateikė William Pursell 09 rugsėjis 2012-09-09 02:28 '12 at 2:28 2012-09-09 02:28

Radau šiuos naudingus:

## bash declare -a files readarray -t files < <(git status --porcelain | perl -ane 'print $F[1],qq(\n) if m/^[ACM]/') # declare -a delfiles readarray -t delfiles < <(git status --porcelain | perl -ane 'print $F[1],qq(\n) if m/^D/') # declare -a huhfiles readarray -t huhfiles < <(git status --porcelain | perl -ane 'print $F[1],qq(\n) if m/^\?/')

git status tris kartus galima pavadinti neefektyviai, tačiau šis kodas yra ne toks sudėtingas, kaip skambinti vieną kartą, saugoti atmintyje ir ciklizuoti rezultatus. Ir nemanau, kad rezultatų įkelimas į temp failą ir jo skaitymas iš disko tris kartus bus greitesnis. Gal Aš nežinau. Tai buvo pirmasis leidimas. Nesivaržykite kritikuoti.

0
10 мая '18 в 20:26 2018-05-10 20:26 atsakymą mpersico pateikė gegužės 10 d. 18 val. 20:26 2018-05-10 20:26

Aš pagaliau suradau sprendimą, kurio ieškojau. Prieš pradedant vykdyti, tikrinama tik indekso būsena ir rodomas indeksas ir darbinis medis taip pat, kaip prieš pradedant.

Jei matote kokių nors problemų ar geriau, atsakykite kaip komentarą ar savo atsakymą.

Daroma prielaida, kad niekas nesistengs šifruoti ar kitaip pakeisti git repozitoriumą ar darbo medį jo veikimo metu. Tai negarantuoja, gali būti neteisinga ir mesti kodą į vėją. NAUDOJIMAS SU ĮSPĖJIMU.

 # pre-commit.sh REPO_PATH=$PWD git stash save -q --keep-index --include-untracked # (stash@{1}) git stash save -q # (stash@{0}) # Our state at this point: # * clean worktree # * stash@{0} contains what is to be committed # * stash@{1} contains everything, including dirt # Now reintroduce the changes to be committed so that they can be tested git stash apply stash@{0} -q git_unstash() { G="git --work-tree \"$REPO_PATH\" --git-dir \"$REPO_PATH/.git\"" eval "$G" reset -q --hard # Clean worktree again eval "$G" stash pop -q stash@{1} # Put worktree to original dirty state eval "$G" reset -q stash@{0} . # Restore index, ready for commit eval "$G" stash drop -q stash@{0} # Clean up final remaining stash } trap git_unstash EXIT ... tests against what is being committed go here ... 
-1
14 сент. atsakymas pateikiamas 14 sepalerių . 2012-09-14 18:32 '12 at 18:32 2012-09-14 18:32