Domanda

Io sono in movimento la mia squadra nel corso di una vecchia repository CVS di utilizzare git. Speravo di aggiungere in un gancio precommit per garantire prima di un commit è fatto a livello locale (e spinto) ogni persona ha un aggiornato pronti contro termine.

Per esempio, nel CVS tutti avrebbero fare un 'cvs up' prima di apportare modifiche, e quindi di commettere. Voglio forzare così la gente non permette la modifica a meno che non hanno fatto un git pull origin master prima (noi non useremo filiali in più)

C'è un modo semplice per fare questo? applausi per qualsiasi aiuto:)

È stato utile?

Soluzione

Controllare e vedere se i SHAs da git ls-remote origin HEAD (punta remoto) e git rev-parse HEAD (punta locale) sono uguali?

Si noti che in questo modo, si sta buttando via un LOT di flessibilità del Git - pensare se questo è davvero che cosa si vuole fare. Parte della forza di git pull è che anche se hai commettere cose che divergevano dalla copia master, quando si tira dal master copiare le modifiche possono essere fusi in (e nella maggior parte dei casi, il processo è completamente automatico).

Se il vostro obiettivo è quello di avere un lineare commettere storia (che ha i suoi compromessi), suggerirei di dare un'occhiata al comando rebase invece di costringere gli sviluppatori a non commettere mai dietro origin / master.

Modifica

In realtà, se si sta facendo solo git pull (invece di rebasing), non sarà in grado di confrontare le teste, perché tirare avrebbe fatto commit di unione. Invece, avresti bisogno di confrontare git ls-remote origin HEAD a git merge-base origin/HEAD HEAD.

Alcuni altri commenti

  • Perché stai usando Git, ma poi non usando filiali in più a tutti? Questo è un po 'come acquistare un auto, ma mai utilizzando il motore (e invece solo spingendo ovunque). I rami sono a buon mercato in Git, veloce da configurare, e quasi senza sforzo per unione. Siete voi stessi facendo un cattivo servizio se non si fanno uso di loro.

  • Perché vi preoccupate per tutti di essere up-to-date prima di apportare modifiche? Questo non è CVS, la risoluzione dei conflitti non è terribile - Git si auto-determinazione del 95% dei conflitti per voi, senza dover fare una cosa, quindi se si git pull prima o dopo aver apportato le modifiche non importa - si solo bisogno di tirare prima di spingere e non avrete problemi.

  • In relazione al punto precedente: dal spinte non-fast-forward vengono respinte per impostazione predefinita, non si ha realmente bisogno di un gancio. Basta dire che gli sviluppatori "se la vostra spinta è respinto in quanto non-fast-forward, fare un git pull, quindi provare spingendo di nuovo" e tutto funzionerà.

Altri suggerimenti

Questo distrugge la natura 'distribuita' di git. Si fa ogni commettere qualche modo globale. I cvs "commit" è analogo al git "push" che è quello che comunica con il terminale remoto.

Se veramente si vuole sfruttare il modello distribuito, si dovrebbe incoraggiare e rendere il vostro team di capire il punto di commit locali, piuttosto che rendere il sistema colpito il repo centrale su ogni commit (che viene segata centralizzata).

Se si sta seguendo il ramo a distanza:

git fetch
git log HEAD..origin
# or:
git diff ...origin

Come altre risposte accennato, costringendo quel tipo di controllo non è sempre una buona soluzione per qualsiasi repo remoto, ma può essere interessante come un avvertimento.

Non dimenticate che un git push sarà per difetto respinto se non è un cambiamento fastforward .
Così il git pull sarà il modo per evitare che il messaggio in ogni caso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top