2012-02-16 18 views
10

Ho creato un piccolo hook pre-commit in python. Questo gancio funziona come un fascino sotto Linux, ma in Windows che continua a dirmi:git non può eseguire python-script come hook

error: cannot spawn .git/hooks/pre-commit: No such file or directory 

So che ci sono state domande simili qui circa lo stesso problema e le cuciture conclusione dalla baracca. Il mio script ha questo sulla prima riga:

#!F:\PortableApps\PortablePython3.2\App\python.exe 

E 'anche interessante notare che l'esecuzione dello script semplicemente scrivendo .git/hooks/pre-commit opere meravigliose, ma non appena provo a commettere, git sputa fuori il messaggio di cui sopra.

Un'altra cosa interessante è, quando si converte la codifica da ANSI a UTF-8 (usando Notepad ++), ottengo il seguente errore quando si tenta di eseguire lo script:

.git/hooks/pre-commit: Cannot execute binary file 

Sto utilizzando il seguente strumenti:

+0

possibile duplicato di [Come posso ottenere il mio script post-commit git (msysgit su windows) per richiamare il mio script python come python piuttosto che bash?] (Http: // stackoverflow.it/questions/1547005/how-can-i-get-my-git-msysgit-on-windows-post-commit-script-to-invoke-my-python) – Amber

+0

@Amber che utilizza uno script di bash come wrapper per chiamata 'python.exe pre-commit.py' funziona. Ma esiste una versione solo per Python? –

risposta

10

Ho usato l'approccio proxy per far funzionare lo script python sotto windows (con msysgit). Lo script completo (con la descrizione di come ho fatto) potrebbe essere trovato qui: https://gist.github.com/1839424

Ecco la parte importante di fare funzionare sotto Windows


Se si lavora con Windows (e " msysgit "), è un po 'più complicato. Poiché "msysgit" sembra avere un problema nella gestione dello SHEBANG, dovrai utilizzare un piccolo trucco per rendere eseguibile lo script (ulteriori informazioni su questo problema possono essere trovate here).

Per far funzionare lo script, è necessario rimuovere lo SHEBANG dallo script Python ("precommit.py") e utilizzare uno script bash wrapper per chiamare l'interprete. Questo script dovrebbe essere simile a questo:

#!/bin/sh 
python .git/hooks/pre-commit.py 

Conservare questo script in un file chiamato "pre-commit" (nessun file fine). Ciò presuppone che tu abbia Python nel tuo PATH. Se non lo fai, puoi anche specificare il percorso completo per il tuo eseguibile-interprete.

Questo script verrà chiamato da "git commit" e chiamerà lo script python per verificare la presenza di file enormi. Il percorso dopo SHEBANG non deve essere modificato, poiché "msysgit" lo rimapperà automaticamente. È necessario specificare un percorso relativo alla repo-root per lo script Python da eseguire (perché è da dove viene chiamato lo script).

Successivamente dovrai copiare sia il file wrapper ("pre-commit") che lo script Python ("pre-send.py") nei repository ".git/hooks" -directory, personalizzare lo script Python ("max_file_size" e "git_binary_path") e contrassegnano l'eseguibile del file "pre-commit".

+3

Se vuoi propagare gli argomenti (ad esempio per il hook post-checkout), aggiungi un '$ *': 'python .git/hooks/pre-send.py $ *' – Onur

+0

Lo script Python stesso non deve essere all'interno la directory .git. Può essere altrove nel tuo repository se preferisci, in modo che venga commesso come parte del repository. Quindi, è anche abbastanza semplice automatizzare l'installazione dei git hook in un nuovo clone del repository creando in modo programmatico gli script di shell descritti qui nella cartella .git/hooks. – bsa

+0

e se i membri del team hanno sistemi operativi eterogenei. Ad esempio, abbiamo un repository Android e gli sviluppatori ci lavorano sia su OS X che su Windows. come possiamo assicurarci che il nostro hook funzioni su diversi sistemi operativi? –