2015-04-02 12 views
12

Ho già ricevuto receive.denyNonFastforwards e receive.denyDeletes sul mio server di repo centrale Git. Ora vorrei bloccare la modifica della cronologia locale se il commit è già stato trasferito al repository centrale (proprio come avviene per impostazione predefinita di mercurial), suppongo di poter utilizzare un hook ma non ho trovato alcun esempio.Come disabilitare la modifica locale dei commit pubblici

È una configurazione strana?

Sembra una protezione di base che chiunque usi git dovrebbe aver attivato e sono abbastanza sorpreso per la mancanza di hook di esempio.

+0

ti penso posso semplicemente negare le spinte forzate, no? –

risposta

3

È possibile impedire la modifica della cronologia locale utilizzando Client-Side Hooks, proprio come si farebbe con Server-Side Hooks.

Here sono alcuni esempi di codice hook sul lato client. Vicino alla fine di quella pagina c'è uno script pre-rebase che fa qualcosa di simile a quello che stai cercando.

noti che ganci lato client non possono essere aggiunti a un repository in modo tale che essi verranno automaticamente impostati in pronti contro valle:

Poiché ganci non vengono trasferiti con un clone di un progetto, devi distribuire questi script in un altro modo e poi farli copiare dagli utenti nella loro directory .git/hooks e renderli eseguibili. Puoi distribuire questi hook all'interno del progetto o in un progetto separato, ma Git non li imposterà automaticamente.

+0

Sono a conoscenza degli hook lato client, stavo cercando un esempio di hook di modifica della cronologia pubblica – angelodiego

+0

Il collegamento fornito nella risposta fa riferimento a una pagina con un hook di pre-rebase di esempio che verifica se i commit hanno già stato spinto al telecomando. –

0

Mercurial offre un modo per gestire il mutevole chagenset (changeset che è possibile riordinare/riscrivere). Ad esempio con lo ChangeSet Evolution plugin.

La possibilità è più limitato sul lato server con git (si può negare la push --force con i due config menzionata nella questione)

Non si può facilmente applicare un gancio sul lato client, in quanto ha bisogno di essere attivato e può essere bypassato con git commit --no-verify.

Ma prima di Git 1.8.5, c'era un pre-rebase client hook called.

Dopo Git 1.8.5, si può fare come un client a git push --force-with-lease:

utente si assume hai preso il contratto di locazione sul l'arbitro quando si azzardato a decidere ciò che la storia dovrebbe essere ricalcolato, e si può spingere indietro solo se il contratto di locazione non è stato rotto.

Ciò consente una certa libertà sul lato client e una spinta forzata più sicura sul lato server.

0

questo sembra molto vicino, se non la stessa domanda come strategia per la prevenzione o la cattura Git Storia Riscrivere

Per riassumere è possibile attivare

config git --system ricezione.denyNonFastforwards vero

e

config git --system receive.denyDeletes vero

o scrivere un post di ricezione gancio per respingere tutto ciò a determinare è una riscrittura

Problemi correlati