2010-05-14 7 views
5

A volte qualcuno nel nostro team fa un push git e interrompe la build perché la sua build locale funziona ma ha dimenticato di impegnare tutte le sue modifiche locali e i file non tracciati prima di spingere.Come posso evitare Git Push se vengono rilevate modifiche locali (inclusi file non tracciati)?

vorrei evitare questo ... ho versato sopra la documentazione per un'ora o giù di lì oggi e non ho trovato nulla costruito.

Qualcuno ha qualche soluzione?

+5

Chiedi ai tuoi sviluppatori di prestare maggiore attenzione? La lavorazione degli utensili non è sempre la soluzione. –

+2

Dai al repository git un po 'di colore e insegna ai tuoi sviluppatori "git add". "git status" e "git add -A" –

risposta

5

È possibile utilizzare il gancio pre-push (dal git 1.8.2).

Il gancio pre-push può controllare il codice di uscita di git status, restituendo 0 (OK per premere) se git status restituisce un valore diverso da zero, altrimenti restituisce 1 (non consentire il push).

La pagina man per git-status dice:

Se non esiste un percorso che è diverso tra il file di indice e l'attuale capo commit (vale a dire, non c'è niente di commettere eseguendo git commit), le uscite di comando con stato diverso da zero.

Qualsiasi repository creato con git 1.8.2 o successivo avrà pre-push.sample nella directory .git/hooks, che è un utile punto di partenza per l'implementazione della politica. Esistono altri buoni esempi di utilizzo del gancio pre-push qui: http://blog.ittybittyapps.com/blog/2013/09/03/git-pre-push/

Si noti che il gancio non viene eseguito sul repository upstream. Ogni clone avrebbe bisogno di avere questo gancio installato, per far rispettare la tua politica. (I ganci non sono clonati come parte del repository Poiché i ganci vengono eseguiti da git, questo design previene gli hook dannosi in esecuzione sul computer di uno sviluppatore. Il codice dannoso dovrebbe invece entrare in un Makefile o configurare uno script, che gli sviluppatori eseguono senza guardare.)

+0

Non è questo l'hook 'pre-push'? – Glyph

+0

@Glyph - grazie! 'pre-push' è stato aggiunto in git 1.8.2, quindi la mia risposta non è aggiornata. Per chiunque sia interessato, ci sono alcune buone informazioni qui: http://blog.ittybittyapps.com/blog/2013/09/03/git-pre-push/ –

0

È possibile utilizzare various hooks (pre-ricezione, credo) per determinare se la spinta interromperà la generazione e la rifiuterà. In aggiunta a ciò, dovresti dire agli sviluppatori di eseguire git status prima di qualsiasi operazione di commit o push, che è una regola incredibilmente ragionevole da implementare e che potrebbe dissuadere tali problemi.

0

Per aggiungere automaticamente le modifiche, è possibile utilizzare il flag -a. Dal git-commit man page:

Dite al comando per automaticamente gli stage che sono stati modificati e cancellate, ma i nuovi file che avete non detto git circa non sono interessati.

Sembra che non ci siano flag per git commit che aggiungono file non tracciati. Ricordare di fare un git add . prima che il commit sia la soluzione migliore a cui possa pensare.

+0

Ricorda però che "git add". aggiunge solo i file che si trovano sotto o sullo stesso livello in cui viene eseguito il comando –

0

Forse metti un alias, nella tua shell o git config, che sostituisce il comando push predefinito con uno script personalizzato che esegue prima lo stato git e controlla la "directory di lavoro pulita"? Non so se è possibile sovrascrivere la spinta, o se lo farebbe in modo tale da non poter chiamare la vera spinta. Solo un'idea in cima alla mia testa, quindi non ho idea se funzioni davvero.

+0

Non è possibile utilizzare un alias per sovrascrivere un comando incorporato . Un alias di shell non può contenere uno spazio, quindi sei praticamente tornato a scrivere il tuo comando. – Cascabel

0

Ho finito per aggiungere un obiettivo di formica alla nostra build locale prima di spingere al nostro repository principale ... ecco l'obiettivo ...nel caso in cui qualcun altro stesse cercando un passo nella giusta direzione.

Grazie a tutti quelli che hanno risposto.

<target name="git-status-check"> 
    <echo>Performing git working directory check for local modifications or untracked files.</echo> 
    <exec executable="git" failifexecutionfails="true" 
     outputproperty="git.check"> 
     <arg value="status"/> 
    </exec> 
    <echo>${git.check}</echo> 
    <propertyregex property="dirty.working.dir" input="${git.check}" regexp="working directory clean" 
     select="\1" casesensitive="false" /> 
    <fail message="Git status reports that you have local modifications or untracked changes in your working dir... did you forget to commit these changes? ${line.separator} "> 
     <condition> 
      <not> 
       <isset property="dirty.working.dir" /> 
      </not> 
     </condition> 
    </fail> 
    <echo>Git status reported a clean working dir continuing build...</echo> 
</target> 
+0

La mia risposta ti ha aiutato/ha risposto alla tua domanda? –

+0

si dovrebbe accettare la risposta di Matt ... questo non è particolarmente utile considerando la domanda (proveniva da Google e il commento di Matt è stato incredibilmente utile) –

+0

Ho fatto ... 6 anni fa – Clintm