2010-05-08 13 views
10

C'è un modo per collegare quando un pull git avviene sul telecomando (simile ad un pre-ricezione o post-ricevere). Fondamentalmente mi piacerebbe essere in grado di far sì che il telecomando commetta qualsiasi cosa abbia quando c'è un pull.Come faccio ad agganciare un git pull al telecomando?

Nella mia situazione, tutto ciò che è in diretta sul telecomando è una fonte autorevole che può ottenere modificate senza un git commit. Voglio essere sicuro che quando tiro sono sempre in grado di ottenere l'ultimo di ciò che è vivo.

+1

Quindi, si invia un commit a un repository remoto e si desidera che il repository remoto si impegni prima che le modifiche vengano unite in esso? –

+0

Non proprio. Altri risultati simili: 1: sul fileA.txt remota viene modificato 2: il locale corro 'git pull a distanza' Quello che vorrei è per la modifica alla fileA.txt per ottenere commit'ed modo che il mio tiro abbassa i cambiamenti che sono stati fatti. – Danny

+0

Perché non modificare fileA.txt localmente, eseguirne il commit ed eseguire il pull sul server remoto? Le modifiche dovrebbero iniziare dall'installazione locale dello sviluppatore e arrivare fino all'ambiente di produzione, non viceversa. – Mathew

risposta

0

Non ho esperienza diretta con git git, e this page può essere d'aiuto, ma non sembra che tu possa essere in grado di farlo.

La soluzione più semplice (e meglio IMO) sarebbe quella di utilizzare un repo diverso l'ambiente di produzione come fonte autorevole. Puoi farlo? Un ambiente di produzione è molto raramente utilizzato come fonte autorevole, perché più recente e stabile sono due cose molto diverse ...

FYI, ho solo mai effettuo un pull git o git status quando in un ambiente di produzione. Eventuali modifiche vengono apportate al mio repository locale, testate, impegnate, inviate a github e quindi trascinate nell'ambiente di produzione.

UPDATE
Vorrei sottolineare che uno dei punti di forza e le caratteristiche di Git è che si tratta di un sistema di controllo del codice sorgente distribuito . In quanto tale, non esiste una fonte autorevole.

+0

Forse autorevole non era il termine corretto, più come una fonte "peer" che è esattamente ciò che promuove git. L'unico problema è che il peer non può impegnarsi da solo, quindi stavo cercando di capire se i git git possono aiutarlo. – Danny

0

Penso che non si può fare questo con ganci, per quello che ho capito leggendo i ganci doc non c'è nessun gancio che si inserisce il vostro requisito.

se ho bisogno di qualcosa di simile a ciò che si desidera mi piacerebbe creare uno script 'a distanza' che passa ogni ora e controlla se un qualsiasi file era modifiche (git status) e si impegnano tutti (git commit -a -m "Auto commit").

+0

Non proprio possibile dal momento che il telecomando è solo una condivisione di file memorizzata su cloud storage. Grazie però, mi sto rendendo conto che questo non sembra esistere. Ho i ganci per quando faccio una spinta non solo un tiro. Credo che dovrò fare una sorta di commit vuoto + push. – Danny

+0

Prova a trovare un modo per montare localmente questa memoria di file in modo da poter usare il comando git del tuo computer locale. Immagino che se potessi accedere al cloud storage come storage locale, potresti fare tutto direttamente dal tuo computer. Se il cloud storage è solo una semplice memoria che contiene i tuoi file e capita di avere la directory .git all'interno ma nessun Git in esecuzione sarà impossibile agganciare qualcosa lì. –

0

Non è qualcosa che io abbia mai fatto prima, ma è possibile eseguire script bash da PHP all'interno:

http://www.devx.com/opensource/Article/40785

che dovrebbe permettere di commettere e spingere una serie di modifiche tramite un Script PHP. Chuck un'interfaccia su di esso o integrarlo nel processo di editing corrente e si dovrebbe essere a posto.

0

Chi/Cosa sta modificando questo file? Se è qualcosa che viene cambiato quando qualcuno cambia qualcosa su un sito, deve essere attivato da qualcosa, il che significa che puoi automatizzarlo. Quando succede qualcosa e il file viene salvato, è necessario attivare il commit. Il commit deve essere fatto a volte e potrebbe anche essere in quel momento.

+0

Ciò presuppone che il telecomando sia effettivamente in grado di eseguire un comando git. Ma nel mio caso, è un file server/copia shadow su skydrive che voglio essere in grado di modificare dal web in occasione. – Danny

3

In primo luogo, per rispondere alla tua domanda effettiva: non ci sono ganci invocati sul lato remoto quando qualcuno va a prendere. (Quando qualcuno tira, tutto il telecomando sa è che essi prelevati da essa - non sa se correvano git pull, git fetch, git remote update ...)

Per quanto riguarda la situazione attuale: Sono d'accordo con Magnus che e' È meglio semplicemente che i commit avvengano dopo le modifiche o, in caso contrario, abbiano una sorta di attività periodica (cronjob?) che verifica le modifiche e commette se ne trova.Se non ti piace nessuna di queste opzioni, ti rimane solo la semplificazione delle operazioni, in modo che sia facile e veloce attivare un commit nel repository remoto prima di eseguire il pull.

Inoltre, suggerirei non per un repository con un albero di lavoro come repository canonico. Sta chiedendo guai se hai mai bisogno di spingerti ad esso. Invece, potresti avere un repository canonico scoperto che il tuo repository live spinge dopo aver eseguito il commit e installare un hook post-receive in quel repository per aggiornare il repository live quando necessario.

+0

Per quanto riguarda l'ultimo paragrafo, ciò non risolve il problema. Questo può essere fatto con gitolite, ma quando qualcuno tira fuori dal repository nudo, come si fa a dire a quello non nudo di impegnarsi tutto a meno che l'utente gitolite abbia i privilegi diretti per chiamare 'git commit', che potrebbe non essere sempre una buona idea . Fondamentalmente ciò di cui molte persone hanno bisogno è di essere in grado di provocare un hook su un repository remoto con un noop. Ecco perché la gente pensa che il recupero potrebbe essere buono, solo per scoprire che non esiste un hook di pre-recupero. Penso che potrebbe essere risolto spingendo su un ramo non esistente ... – nus

+0

... Va bene per qualcosa di automatico come la gitolite, ma è fastidioso se gli umani devono ricordarselo prima di fare un tiro ... – nus

1

Sfortunatamente git non fornisce ganci nativamente per questo, poiché è un caso d'uso perfetto per controllare qualcosa prima di consentire un pull/fetch.

non so se il vostro 'a distanza' è su un computer locale, ma se non lo è, dare un'occhiata a gitolite che ha ganci che sono pensati proprio per questo:

Dal v2 gitolite docs:

"gl-pre-git" gancio

Anche se Git ha un sacco di bei ganci è possibile attingere, tutti corrono solo su una spinta. Non c'è nulla che funzioni su un fetch o un clone, e non c'è modo di eseguire qualcosa prima che git-receive-pack o git-upload-pack, (a seconda dei casi) siano invocati.

Ecco a cosa serve il gancio gl-pre-git. Se è presente un hook eseguibile chiamato gl-pre-git, verrà richiamato con la directory corrente impostata su repo.git e con un singolo argomento che sarà R o W in base a ciò che il client sta tentando di fare.

Per v3 gitolite, qui the docs about triggers. La documentazione è un po 'criptico, ma qui è come funziona:

  1. in ~/.gitolite.rc aggiungere (sulla portata globale):

    PRE_GIT => [ '<pre_git_trigger_script_name>' ]

  2. nello stesso file guarda la riga che ti permette di impostare LOCAL_CODE e impostalo dove vuoi tu

  3. Nella directory che hai impostato per LOCAL_CODE, crea una sottodirectory chiamata "trigger" e crea uno script chiamato <pre_git_trigger_script_name> con qualsiasi cosa tu abbia formica da fare a quel punto ... (assicuratevi fare per: chmod +x <pre_git_trigger_script_name>

  4. corsa gitolite setup

  5. prova & & hanno una buona giornata

aggiornamento: In realtà usando gitolite, Penso che potresti fare in modo che il trigger pre-git faccia qualcosa come push su un ramo inesistente e quindi esegui l'hook per pre-ricevere nel tuo repository non bare per rifiutare il push, ma per fare git add --all . && git commit -m"autocommit" && push gitolite in the p rocess. Questo è utile quando non si desidera consentire ai privilegi di utente di hosting gitolite di eseguire comandi direttamente nel repository non nudo.

+0

"non c'è modo di esegui qualcosa prima di git-receive-pack o git-upload-pack "... eccetto, ovviamente, per averli appena terminati ... è solo un codice. – jthill

Problemi correlati