ugrás a tartalomhoz

Git - add nem működik pre-commit hook-nál

inf · 2012. Feb. 11. (Szo), 06.13
Ü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:

#!/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
Bármi ötlet?
 
1

Elméletileg nem szükséges, de

inf · 2012. Feb. 11. (Szo), 06.21
Elméletileg nem szükséges, de kipróbáltam, hogy az add után committolok. Nem vezetett eredményre, és belegondolva végtelen ciklushoz kellene, hogy vezessen, mert a commit újra meghívja a pre-commit-ot, és így tovább... Van olyan option a commit-hoz, hogy no verify, ami elvileg kikapcsolja a pre-commit-ot ilyen esetre. Próbáltam azzal is, de kevés sikerrel...

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
2

Jó ez?

janoszen · 2012. Feb. 11. (Szo), 09.06
A másik oldalról közelíteném meg a dolgot: jó ez neked? Nem tudom, min dolgozol, de nekem nem tűnik túl konstruktív módszernek az, hogy az egész adatbázis dumpot mentjük. Én inkább az egyes modulokhoz, részegységekhez tartozó create SQL-eket tartanám valami egységes helyen és írnék scriptet ezek importálására.

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.
7

Jobb, ha nem tudod min

inf · 2012. Feb. 11. (Szo), 23.16
Jobb, ha nem tudod min dolgozom, gáz :D
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.
3

Doksiból nem derült ki

H.Z. v2 · 2012. Feb. 11. (Szo), 09.44
Pár perces keresgéléssel talált leírásokból ugyan nem derült ki, hogy van-e bármiféle korlátozás a pre-commit hookban végezhető tevékenységekre, de van egy olyan érzésem, hogy valami "illegális" dologgal próbálkozol.
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.
5

Valóban lehet abortálni: exit

inf · 2012. Feb. 11. (Szo), 23.08
Valóban lehet abortálni: exit 0 továbbengedi a committot, exit 1 meg abortálja. Leírást nem néztem hozzá, csak mások kódjait.

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.
4

Új parancs

Poetro · 2012. Feb. 11. (Szo), 13.18
Mi lenne, ha csinálnál inkább egy új parancsfájlt, ami végrehajtja a dumpolást, add-ot, majd a commitot?
6

Valószínűleg ez lesz, mert

inf · 2012. Feb. 11. (Szo), 23.10
Valószínűleg ez lesz, mert előfordulhat, hogy mondjuk csak az adatbázishoz nyúlok hozzá, és kódot nem írok, ilyenkor viszont nincs mit committálni, hogy a pre-commit meghívódjon... :-) (legalábbis a netbeans pluginnel)

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...
8

Próbáltam WSH-ban futtatni a

inf · 2012. Feb. 12. (V), 04.30
Próbáltam WSH-ban futtatni a dump-ot, de nem jött össze:

var shellObj = WScript.CreateObject('WScript.Shell');
var exec = shellObj.Exec(
	'"C:\\Program Files\\MySQL\\MySQL Server 5.5\\bin\\mysqldump.exe"'+
	" --skip-comments -u root --password=root webshopdb |sed 's$),($),\\n($g' > " + 
	'"D:\\creation\\software developer\\projects\\webshop-refactoring-project\\document root\\WebShop\\DataBase\\backup.sql"'
);
WScript.Echo(exec.StdOut.ReadAll());
A cucc lefut, az eredmény úgy néz ki, mint egy dump header, vagy micsoda, viszont a backup fájl nem jön létre. :S

Ért valaki ehhez?

(Ugyanez a pre-commit-nál létrehozta a fájlt.)
9

Hibás az eredeti elképzelés

H.Z. v2 · 2012. Feb. 12. (V), 14.42
A pre-commit hook is a piece of code that runs before every commit and determines whether or not the commit should be accepted. Think of it as the gatekeeper to your codebase.


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á.
10

Értem, hát akkor elég fura,

inf · 2012. Feb. 12. (V), 18.50
Értem, hát akkor elég fura, hogy ilyen példakódokat tesznek ki netre. Jól benéztem mindenesetre... Legközelebb jobban utánanézek mielőtt megpróbálok valami ilyesmit alkalmazni.
13

Nem győzöm emlegetni: mióta

H.Z. v2 · 2012. Feb. 15. (Sze), 10.27
Nem győzöm emlegetni: mióta ELTÉ-s anyagban is találtam hülyeséget... hát eddig sem volt túl nagy bizalmam a neten található leírásokhoz, ha elméletről volt szó, azóta még kevésbé...
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.
11

Közben átnéztem egy sereg

inf · 2012. Feb. 15. (Sze), 05.11
Közben átnéztem egy sereg kérdés-választ a témában, és nekem úgy tűnik, hogy csak valami anomália, ami miatt a git add nálam nem működik. Többek között stackoverflow-on is van olyan elfogadott téma, amiben erre kérdeznek rá, és azt írják benne, hogy minden további nélkül használható az add a pre-commit hook-ban. Majd ha több időm lesz, akkor tesztelem --no-verify paraméterrel az add-ot, hátha úgy hozzáadja az aktuális commit-hoz a fájlt.
12

Én így oldottam meg.

deejayy · 2012. Feb. 15. (Sze), 09.28
Én így oldottam meg. Windows-on:

\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.
14

Én külön futtatom ezt a

inf · 2012. Feb. 15. (Sze), 18.52
Én külön futtatom ezt a hook-ot, amikor módosítom az adatbázist, és akkor nincs ilyen gond.