Qual è la migliore pratica per aggiornare il core di Drupal senza rompere il repository Git e il sito Web di produzione


13

Ho un repository Git in cui tutto il mio codice si trova nel ramo master e in precedenza stavo semplicemente ignorando tutti i file Drupal, in modo da mantenere una stretta separazione tra il codice che ho scritto (o modificato o che potevo modificare) e il codice che potrebbe essere generato con Drush o altro.

Sembrava una buona strategia fino a quando non ho dovuto aggiornare Drupal. Mi sono reso conto che volevo essere in grado di tornare indietro se le cose fossero andate male e quale strumento migliore da usare di Git per farlo. Ho pensato che questa sarebbe stata la situazione perfetta per un ramo di funzionalità, quindi ho creato un drupal-7.14ramo, l' ho fatto proprio .gitignoreper ignorare tutti i miei file di codice e impostazioni e prestare attenzione solo ai file che fanno parte dell'installazione di Drupal che non vorrei essere toccante. Ho fatto un aggiornamento a mano (download, decomprimere, decomprimere, copiare), selezionando i casi limite come robots.txt e .htaccess e sovrascrivendo il .gitignore di Drupal con il mio. Ho riparato alcune impostazioni che funzionavano con 7.14 ma non con 7.15, per recuperare da un errore 500, e poi tutto sembrava perfetto. Ho ribattezzato il ramo drupal-7.15e stavo per andare felicemente sulla mia strada.

Fino a quando non ho realizzato ciò che avevo inavvertitamente fatto: i file che in precedenza non erano stati tracciati dal mio ramo master ma lasciati nella directory di lavoro erano ora rimossi dalla directory di lavoro quando ho controllato master, poiché non erano più file non tracciati! D'Oh!

Se unisco il drupal-7.15ramo con il master perderò la separazione del codice.

C'è probabilmente un modo per convertire un ramo in un sottomodulo. Supponendo che sia possibile, potrebbe essere la migliore strategia. Prima di farlo sapevo che i sottomoduli erano la soluzione "giusta", ma dato che non avevo realizzato l'effetto collaterale dell'utilizzo dei rami per file precedentemente non tracciati, ho deciso di tagliare gli angoli e seguire quella strada. (Inoltre, tutti gli approcci che ho visto sull'uso dei sottomoduli con Drupal presuppongono che tu stia iniziando un nuovo progetto e Drupal sarà il ramo principale. Per me non è desiderabile rendere il codice di qualcun altro il ramo principale, e ho già avuto un repository con un ramo master. Sembrava che sarebbe inutilmente complicato solo fare un aggiornamento.)

Potrebbe esserci qualche altra soluzione a cui non ho pensato.

Come posso recuperare al meglio da questo con il minor numero possibile di aspetti negativi?

AGGIORNAMENTO : è in fase di sviluppo (in una macchina virtuale Linux sul mio laptop) e non è ancora andato in produzione. Quando andremo in produzione, ho in programma di avere tutto avvolto in moduli funzione, ma non è ancora a posto.

AGGIORNAMENTO 2 : I sottomoduli potrebbero non funzionare. Secondo Pro Git , "I sottomoduli consentono di mantenere un repository Git come sottodirectory di un altro repository Git". Drupal non fornisce una separazione così piacevole. Invece che tutto il codice Drupal sia in una sottodirectory, la relazione è più o meno invertita, ma non c'è ancora una separazione netta, poiché potresti modificare il tuo .htaccess e robots.txt, quindi il tuo codice e il repository Drupal sono mescolati insieme. Sto cercando una soluzione alternativa a questo problema .


La tua domanda riguarda davvero Git. Penso che otterrai risposte migliori facendo migrare questo su un sito che non è specifico di Drupal. Informazioni sugli aggiornamenti: eseguo sempre gli aggiornamenti creando il file make in una nuova directory e quindi aggiorno il collegamento simbolico dalla vecchia alla nuova directory pubblica, il che rende banali i rollback del codice.
Letharion,

2
@Letharion Non sono d'accordo. Ognuno passerà attraverso questo processo di aggiornamento del proprio sito dalla versione corrente a una nuova. L'uso di git per aggiornare core è abbastanza comune, in quanto si tratta di un metodo ampiamente utilizzato per aggiornare i moduli. Molte persone avranno problemi con questo problema, come ho avuto prima. Al momento non esiste una buona documentazione sul web che affronti questo problema e credo che questo sia un buon posto per farlo.
iStryker

Giusto per chiarire, penso che una domanda su "Best practice per l'aggiornamento di Drupal" sarebbe quindi più adatta, in quanto questa domanda è davvero "Come posso riparare un errore git", che non credo appartenga qui. Non ho comunque forti sentimenti sull'argomento, quindi lo lascerò a quello. :)
Letharion,

Ok abbastanza giusto. Il problema che Brandon ha è abbastanza comune. Forse dovrei creare una nuova domanda o riscriverla (e spostare il resto in un'altra domanda). I primi 2-3 paragrafi sono comuni. Si crea un repository git di 7.x-1.0 e si desidera eseguire l'aggiornamento a 7.x-1.1. I file problematici sono .gitignore, .htaccess e robot.txt. A volte li vuoi tracciare perché sono modificati, a volte non li vuoi tracciare perché perché sono modificati. Quando si aggiorna il repository, si crea un nuovo ramo l'unione o semplicemente aggiorna master. @Letharion Suggerimento?
iStryker

@Letharion: ho pensato di metterlo su StackOverflow come domanda Git o qui come domanda Drupal. Se lo mettessi lì tutti si lamenterebbero e direbbero che questo riguarda davvero Drupal, e penso che avrebbero davvero ragione. Anche se Git può essere lo strumento utilizzato per riparare la situazione, la direzione presa dipende dalla conoscenza di Drupal. Ogni utente di Drupal usa Git (o dovrebbe farlo in caso contrario), ma solo una piccola parte degli utenti di Git utilizza Drupal. Le persone che rispondono alle domande su Git non capiranno il background di Drupal.
iconoclast

Risposte:


10

Dalla discussione sopra sembra che la tua domanda non riguardi la correzione del repository git, ma la gestione di un sito Drupal in git e come funziona con gli aggiornamenti di base.

Penso che la pratica standard stia effettivamente mantenendo tutti i file nel tuo repository, incluso il core di Drupal. La separazione del codice Drupal dal codice personalizzato sembra una buona idea, ma non credo sia necessario e non vedo quali vantaggi ti offre. Sembra anche supporre che non vorrai mai patchare core (o doverlo fare come parte della tua distribuzione), che, sebbene non sia la migliore pratica, è sicuramente qualcosa che vuoi essere in grado di fare se qualcosa si rompe in produzione. Mantenere i tuoi impegni piacevoli e mirati aiuta anche a ottenere questo tipo di separazione.

La soluzione che ho usato è di mantenere tutto il codice nello stesso repository, mettere il più possibile in Funzionalità o altri tipi di esportazione / codice / configurazione e mantenere un elenco di patch che devono essere applicate al di fuori del -box core e contrib.

Quando aggiorni core, inizia nel tuo ambiente di sviluppo:

  • Assicurarsi che la directory di lavoro sia pulita
  • Scarica l'ultimo database ( drush sql-dump). O fai un commit con il dump o salvalo in un posto sicuro.
  • Update core ( drush up drupal)
  • Effettua tutte le modifiche.
  • Controlla il file delle patch. Se è necessario applicare eventuali patch, applicarle ed effettuare un altro commit
  • Esegui update.php se necessario (già fatto se hai usato drush per l'aggiornamento)
  • Metti alla prova il tuo sito di sviluppo. Se tutto va bene, invia il codice alla produzione. Funziona drush updbin produzione.
  • Se c'è un problema e devi ripristinare, ripristinare o reimpostare il repository ( git reset --hard HEAD~2dovrebbe farlo) o ripristinare i due commit se si desidera mantenere la cronologia. Sostituisci il tuo database con il dump.

Il dump del database è necessario perché altrimenti non è possibile annullare le modifiche apportate al database dagli aggiornamenti. Puoi anche eseguire l'aggiornamento in un ramo, nel qual caso il ripristino significa semplicemente estrarre il master. È leggermente sconsigliabile se stai lavorando su un sito di sviluppo perché non puoi davvero tornare al master e continuare a lavorare lì in parallelo a causa del database.

L'uso di questo più semplice flusso di lavoro sul lato git ti consentirà di usare tutta la potenza di git quando ne hai bisogno senza la complicazione di sottomoduli, ecc. Se questo non sembra adeguato, potresti spiegare perché hai bisogno di un'ulteriore separazione del codice?


0

Dai miei commenti sopra, questa domanda che hai riguarda il mantenimento dei file di un sito Drupal con git e come funziona con gli aggiornamenti di base. Non hai menzionato nulla sul backup e l'aggiornamento del database. Cercherò di non copiare nulla dalla risposta Goron.

Ho creato un post sul blog su questo problema Aggiornamento di Drupal core sul tuo sito Web con Git

Metodi alternativi

  1. Esegui comando Drush drush up drupal
  2. Applica una patch delle differenze tra le versioni. Vedi http://drupal.org/node/359234 e http://fuerstnet.de/en/drupal-upgrade-easier

Non lo hai dichiarato, ma se sei interessato a tenere traccia delle modifiche tra le versioni di Drupal, lo farei usando i tag anziché i rami . Una volta terminato il commit dell'upgrade , masterizza il codice come 7.x.


Se ho capito bene, mi stai anche suggerendo di mantenere tutto il codice core di Drupal nello stesso repository. Questo sembra essere il consenso. Sono riluttante, ma potrei dover arrendermi e farlo in quel modo.
iconoclast

Sì, tutto in un repository. Ho moduli, profili e temi all'interno del repository core / principale che sono i loro repository git. Non so se il modo migliore, ma è il modo migliore che io conosca.
iStryker,

questa soluzione non fornisce alcun modo di tornare indietro. la mia ragione per votare in basso.
Andre Baumeier,

@Serpiente: non vedo perché la mancanza di un modo per tornare indietro dovrebbe essere un motivo per un voto negativo. Se è l'approccio migliore, è abbastanza. Se non pensi che sia l'approccio migliore, ti preghiamo di indicare perché no.
iconoclasta,

@iconoclast qual è il problema di un sistema di revisione se non puoi tornare indietro nella tua sequenza temporale? ad es. pensare a un aggiornamento fallito - quale sarebbe il modo di recuperare qui? Una versione fornita di "qualunque" software dovrebbe avere chiare dipendenze, tra cui in particolare il core framework. Altrimenti puoi semplicemente abbandonare il git e ricominciare a lanciare FTP. solo i miei 2 centesimi.
Andre Baumeier,

0

Sto eseguendo l'installazione con due rami proprio come l'OP: un ramo con solo il mio codice personalizzato e un ramo che ha sia i miei file personalizzati che quelli principali. Mi sono imbattuto nella stessa situazione: i file core ignorati vengono rimossi quando si passa da una filiale all'altra.

Ho finito per avere due identiche directory git: - una per lavorare sul mio codice personalizzato, con i file core presenti ma ignorati, e non passerei mai al ramo "completo" in questa directory - uno per eseguire le fusioni, quindi eseguire il cambio di ramo e l'unione solo all'interno di questa directory.

Il motivo per cui ho scelto questa configurazione a due rami è perché voglio tracciare facilmente tutti i commit locali sui file core, è più facile esaminare e riapplicare le mod core quando aggiorno i file core.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.