Git - add nem működik pre-commit hook-nál
Üdv.
Szereztem egy kódot, aminek elvileg mennie kéne git commit-nál. Azt csinálja, hogy lementi az adatbázist egy sql fájlba, és hozzácsapja a commithoz. Az a gondom vele, hogy az sql gyártás az működik, viszont az újonnan készült sql nem kerül bele a commitba. Így meg nem ér semmit, mert ennyi erővel kézzel is dumpolhatnám, és betehetném a commit-ba... Az eredeti kódon már tákoltam kicsit. Eltartott egy darabig mire google megadta a válaszokat, viszont ezt az add problémát még mindig nem sikerült megoldani, és nem is nagyon találok rá semmit...
Íme a kód:Bármi ötlet?
■ Szereztem egy kódot, aminek elvileg mennie kéne git commit-nál. Azt csinálja, hogy lementi az adatbázist egy sql fájlba, és hozzácsapja a commithoz. Az a gondom vele, hogy az sql gyártás az működik, viszont az újonnan készült sql nem kerül bele a commitba. Így meg nem ér semmit, mert ennyi erővel kézzel is dumpolhatnám, és betehetném a commit-ba... Az eredeti kódon már tákoltam kicsit. Eltartott egy darabig mire google megadta a válaszokat, viszont ezt az add problémát még mindig nem sikerült megoldani, és nem is nagyon találok rá semmit...
Íme a kód:
#!/bin/sh
# Refresh the SQL schema file for inclusion within the git commit
# If something fails, exit with status other than 0
set -e
# select repository root
cd "$(git rev-parse --show-toplevel)"
# first, remove our original schema
rm -f "WebShop\DataBase\backup.sql"
# generate a new schema
exec "C:\Program Files\MySQL\MySQL Server 5.5\bin\mysqldump.exe" --skip-comments -u root --password=root webshopdb |sed 's$),($),\n($g' > "WebShop\DataBase\backup.sql"
# Add the schema to the next commit
git add "WebShop\DataBase\backup.sql"
# Exit success
exit 0
Elméletileg nem szükséges, de
Amire gondolni tudok, hogy külön szálon megy le az exec, és a pre-commit nem várja végig, a másik, ami eszembe jutott, hogy a commit előtt lehet, hogy készít a git egy listát a fájlokról, amik módosultak, és mivel azon a listán a dump nem módosult, ezért az add sem működik rá. Ezek csak ötletek, igazából nem találok semmit ezzel kapcsolatban :S Elég gáz, mert sok órát elcsesztem már ezzel, és tényleg csak ennyi hiányzik :S
Jó ez?
A git add-os módszerrel az a bajom, egy commitnak elvileg egy egységnyi változást kell tartalmaznia, hogy visszavonható legyen, viszont az adatbázisban közben módosulhatott más is.
Jobb, ha nem tudod min
Teszt adatokkal dolgozom, szóval nem féltem őket, viszont ami biztos, hogy változtatni fogok egy meglévő (más által írt) projekt adatbázis szerkezetén, ezért van szükségem arra, hogy az adatbázis módosításait is tudjam committálni, vagy visszaállítani szüksége esetén. Nekem ez tűnt a leggyorsabb módszernek, de talán pre-commit helyett jobb, ha parancsfájlba teszem csak a dumpolós kódot, és megpróbálom valahogy rábírni a netbeans-t, hogy hívja meg, ha nekem úgy tetszik.
Doksiból nem derült ki
A commit feladata a már létező változások véglegesítése. Találtál valami írást arról, hogy mi történik, mielőtt a pre-commit script elindul és mi történik, miután 0-s kóddal kilép ugyanez a script?
Csak feltételezem, hogy mielőtt meghívná a scriptet, indít valami tranzakcióféleséget, majd a scripted befejezése után a visszatérési kód függvényében véglegesíti vagy abortálja. Ha ez így van, akkor a scripten belülről kiadott, repository-t módosító parancsokat már csak a köv. commit fogja rögzíteni, újabb commit indítása pedig megjósolhatatlan következményekkel járna.
De még1x mondom: ez csak feltételezés, mert nem találtam erre utaló infót.
Valóban lehet abortálni: exit
Elméletileg az add-nak működnie kell, legalábbis más nem panaszkodott rá, hogy nem megy, és ez az, ami furcsa. Lehet, hogy operációs rendszer függő, passz.
Új parancs
Valószínűleg ez lesz, mert
A probléma mindössze annyi, hogy a kód a git shell-t használja, és nem tudom hogyan lehetne megoldani, hogy git shell-ben parancsfájlból futtassam...
Próbáltam WSH-ban futtatni a
Ért valaki ehhez?
(Ugyanez a pre-commit-nál létrehozta a fájlt.)
Hibás az eredeti elképzelés
Ezt a szöveget itt találtam, de alátámasztja az eredeti elképzelésemet: csak ellenőrzési célra való a pre-commit hook, nem arra lett kitalálva, hogy bármi olyan műveletet végezz benne, ami a commit működését egyéb úton befolyásolná.
Értem, hát akkor elég fura,
Nem győzöm emlegetni: mióta
Persze ez nem jelenti azt, hogy igazam van, csak amit te akarsz csinálni, az valahogy ellenkezik az általam tanult/tapasztalt dolgokkal.
upd: mindenesetre érdekesen működik. Kipróbáltam és vannak esetek, amikor a pre-commit-ból létrehozott és git add-del hozzáadott fájl bekerül a repoba, de van olyan is, hogy nem. Elég zavaros. És továbbra sem találok rá határozott leírást, hogy szabad-e ilyesmit csinálni vagy sem.
Közben átnéztem egy sereg
Én így oldottam meg.
\blogmotor\.git\hooks\pre-commit
#!/bin/sh
d:/usr/prg/mysql/bin/mysqldump --defaults-file=$PWD/work/cli.cnf -d blog | egrep -v "Dump completed on" > $PWD/sql/blog.sql
exit 0
Tökéletesen működik, az adatbázis szerkezetét kidumpolja commit előtt. Ennek az a hátránya, hogy az sql mindig egy lépéssel hátrébb lesz commitolva. Vagy kétszer kell commitolnom egyszerre.
Én külön futtatom ezt a