Git - post-receiving hook arbejder ikke på remote windows server

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at få en git post-receive hook arbejder på Windows.


Jeg bruger Git 1.7.9 (Msysgit) og har en repo lokalt og en ren repo på en fjernserver. Jeg kan hente, begå, skubbe osv. Jeg har oprettet en post-modtagekrog, der skal checke filerne i en arbejdsmappe (en del af implementeringsprocessen), men det ser ud til at virke.


Her er hvad jeg gør:



  1. Skift en fil, et stadium og forplig det

  2. Skub til fjernserver - succesfuldt

  3. Forvent at se ekkoen - don't se ekkoen

  4. Kontroller arbejdsmappe på server - nyeste filer er ikke der

  5. Log på serveren og kør håndskriftet manuelt - de nyeste filer er checkout ud i arbejdsmappen.



Jeg har ændret krogen, så det gør ikke andet end ekko en besked, og jeg har læst, at jeg skal se dette i min konsol efter at have skubbet. Men dette vises ikke, så jeg kan kun antage, at krogen ikke bliver fyret af.


Jeg skubber over HTTP med git dot aspx på serveren, der håndterer anmodningen og pusser via gui lokalt. Derefter prøvede jeg Bonobo, og krogen virker ikke, når du skubber via gui eller bash-konsollen.


Jeg antager, at nogen har dette arbejde et sted, men efter to dage med at søge alt, hvad jeg har fundet, er løsninger, der ikke hjælper eller mennesker med det samme problem, der er gået ubesvarede.


(Jeg er en git newbie btw).


Skål.


Opdater


Jeg begynder at tro, det kan være at gøre med tilladelser - men Unix-tilladelser, snarere end NTFS. Når @ de nævnte tilladelser havde jeg antaget NTFS. Men efter mere gravning ser det ud til, at Git on Windows stadig kontrollerer Unix-fil perms.


Så jeg formoder, at problemet er, at post-modtagelsesfilen ikke kan eksekveres, som når jeg gør en ls -o det 's -rw-r - r-- (644 tror jeg). Hvis jeg forsøger at ændre dette gennem bash og chmod 777 post-receive så gør ls -o tilladelserne er de samme.


Det mærkelige er, at så snart jeg redigerede efter modtagelse (med notesblok ++) bliver udførslen fjernet. (mit test script, der slutter i .bat bevarer sine udførlige bits selvom ...)


BTW, brugeren jeg er logget på som ejer af filerne (ifølge ls -o) og alligevel kan jeg ikke indstille tilladelserne.


Begynd at blive virkelig forvirret nu. Mangler jeg noget virkelig indlysende?


Opdater 2


Hverken chmod 777 post-receive eller chmod a+x post-receive arbejder. Jeg tog en ny, ren post-modtagelsesfil, uploadede den til serveren og kontrollerede tilladelserne og den havde udført. Hvis jeg omdøber filen (for at fjerne prøve) i Windows, fjernes execute. Hvis jeg gør det i bash med mv execute bevares.
Men når jeg redigerer filen (i Windows eller i bash med vi), bliver execute fjernet.


Så problemet er nu, hvorfor fjerner de udførne bits, når jeg redigerer filen?


Forhåbentlig er dette den endelige forhindring og årsagen til det ikke at udføre ...

Bedste reference


Du bliver nødt til at patchere git for at gøre dette arbejde. Kontrolerne i builtin/receive-pack.c er for access(path, X\_OK). I msysgit omdirigerer dette til mingw\_access, som smider X\_OK-bitten væk, da det er simpelt, ikke understøttes på Windows.


På vinduer har vi ingen flag for at angive, at en fil er eksekverbar. Systemer gør ofte emulering af dette. For eksempel vil tcl søge efter en udvidelse i miljøvariabelen PATHEXT for at bestemme, at en fil er eksekverbar. Det kan vi ikke gøre her, da krogenavnene er hardcoded uden forlængelser.


I stedet foreslår jeg at ændre adgangstesten for at kontrollere, at filen eksisterer, og derefter ringe execv på stien. Mingw-versionen af ​​denne (i compat/mingw.c) leder efter scriptfiler og vil læse shbanglinjen og starte en passende tolk (sh, perl osv.). Så modifikation builtin/receive-pack.c:run\_update\_hook bør lade dette fungere for dig. I øjeblikket kører kørslen start\_command og jeg synes, at det burde kalde ned til execv for dig.


Kort sagt, ændre adgangstesten, og det vil nok fungere.

Andre referencer 1


Når du bruger msysgit på serveren og skubber via en fil deles krogene uden problemer nu. Måske var dette fastsat i mysysgit siden svaret blev skrevet. Jeg kiggede ikke på det.


Jeg bemærkede også, at det oprindelige spørgsmål erklæret git dot aspx og Bonobo blev brugt som bruger GitSharp.dll. Dette ville betyde, at applikationen ikke skaler til git.exe, og kroge ville ikke blive håndteret på samme måde.


For eksempel har GitSharp.dll, der anvendes i git dot aspx, sin egen krog efter modtagelse krog implementering, som kunne udføres i C #:


public void Receive(Stream inputStream, Stream outputStream) 
{
    using (var repository = GetRepository()) 
    {
        var pack = new ReceivePack(repository);
        pack.setBiDirectionalPipe(false);

        //setup post receive hook here
        pack.setPostReceiveHook(new PostRecieveHook());

        pack.receive(inputStream, outputStream, outputStream);
     }
}


public class PostRecieveHook : IPostReceiveHook 
{
    public void OnPostReceive(ReceivePack rp, ICollection<ReceiveCommand> commands) 
    {
        //Do PostRecieve Hook Work Here
    }
}


Jeg håber at hjælpe andre med forvirring mellem biblioteker, der er implementeringer af Git og applikationer, der kalder op til selve git.exe.