{"id":74293,"date":"2023-11-13T11:13:33","date_gmt":"2023-11-13T10:13:33","guid":{"rendered":"https:\/\/kinsta.com\/it\/?p=74293&#038;preview=true&#038;preview_id=74293"},"modified":"2023-11-13T17:29:52","modified_gmt":"2023-11-13T16:29:52","slug":"git-hook","status":"publish","type":"post","link":"https:\/\/kinsta.com\/it\/blog\/git-hook\/","title":{"rendered":"Git Hook: tecniche avanzate e best practice"},"content":{"rendered":"<p>Git non deve essere necessariamente complesso, ma ci sono alcuni suoi aspetti che sono intricati e che richiedono una comprensione pi\u00f9 approfondita: gli hook di Git, ad esempio. Si tratta di script che Git esegue automaticamente in base a determinati eventi.<\/p>\n<p>Per quanto possano essere usati in maniera semplificata, \u00e8 possibile utilizzarli anche in modo molto pi\u00f9 efficace. Tuttavia, per farlo, \u00e8 necessario comprendere tutti gli ingranaggi che compongono l&#8217;intero sistema.<\/p>\n<p>In questo post analizzeremo le tecniche avanzate per i Git Hook che includono alcune nozioni di base, come crearli e installarli e altro ancora.<\/p>\n<p>Inoltre, spiegheremo come funzionano i parametri degli hook e le variabili d&#8217;ambiente, offriremo alcuni suggerimenti e trucchi, esamineremo i metodi di risoluzione dei problemi e molti altri argomenti.<br \/>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc><\/p>\n<h2>Nozioni di base di Git Hooks: un&#8217;infarinatura<\/h2>\n<p>Una delle caratteristiche principali di <a href=\"https:\/\/git-scm.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Git<\/a> sono gli hook: un potente meccanismo che permette di automatizzare le attivit\u00e0, applicare gli standard e garantire flussi di lavoro coerenti durante il ciclo di vita di un progetto.<\/p>\n<p>Gli hook di Git sono script che vengono eseguiti automaticamente in punti specifici del flusso di lavoro di Git. Potete usarli per personalizzare ed estendere il comportamento di Git in base alle esigenze del progetto. Gli hook garantiscono il mantenimento della qualit\u00e0 del codice, l&#8217;esecuzione dei test e l&#8217;organizzazione delle distribuzioni senza problemi.<\/p>\n<p>Git offre diversi tipi di hook, ognuno dei quali si attiva in fasi diverse del workflow di Git:<\/p>\n<ul>\n<li><b>Pre-commit.<\/b> Questi hook vengono eseguiti prima di finalizzare un commit e permettono di applicare stili di codice, eseguire test o verificare la presenza di errori di sintassi.<\/li>\n<li><b>Post-commit.<\/b> Vengono eseguiti dopo aver creato un commit. \u00c8 utile per le notifiche o il <a href=\"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/\">logging<\/a>.<\/li>\n<li><b>Pre-push.<\/b> Questo hook si attiva prima del <a href=\"https:\/\/kinsta.com\/it\/blog\/come-inviare-codice-github\/\">push del codice<\/a> e permette di eseguire test di integrazione, verificare la compatibilit\u00e0 o garantire la qualit\u00e0.<\/li>\n<li><b>Post-push.<\/b> L&#8217;ultimo hook viene eseguito dopo aver completato un push. Per questo motivo \u00e8 utile per distribuire il codice in produzione o per aggiornare la documentazione.<\/li>\n<\/ul>\n<p>Troverete gli hook nella directory <code>.git\/hooks<\/code> del repository Git. Ci sono anche degli esempi di hook: potete usarli come template per creare i vostri script personalizzati. Gli hook coprono una serie di azioni e utilizzano il prefisso <b>sample-<\/b> come riferimento:<\/p>\n<figure id=\"attachment_166981\" aria-describedby=\"caption-attachment-166981\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-166981 size-full\" title=\"Sample Hooks Directory\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/10\/sample-hooks-directory.png\" alt=\"Una schermata del Finder di macOS che mostra una directory locale contenente 13 file hook di esempio bianchi su sfondo grigio.\" width=\"1000\" height=\"644\"><figcaption id=\"caption-attachment-166981\" class=\"wp-caption-text\">Una directory Git locale che mostra i file di esempio degli hooks.<\/figcaption><\/figure>\n<p>Gli hook si attivano durante varie azioni di Git. Ad esempio, un hook pre-commit viene eseguito quando eseguite il commit delle modifiche e un hook pre-push si attiva prima di eseguire <a href=\"https:\/\/kinsta.com\/it\/blog\/git-contro-github\/\">il push in remoto<\/a>. Una volta che avrete compreso meglio questi trigger, potrete distribuire gli hook in modo pi\u00f9 strategico per rafforzare il controllo di qualit\u00e0 e ottimizzare il vostro flusso di lavoro.<\/p>\n<h2>Come creare e installare gli hook Git personalizzati<\/h2>\n<p>Creare e installare gli hook Git personalizzati di base pu\u00f2 essere un processo complesso. Tuttavia, i fondamenti che utilizzeremo qui serviranno per sviluppare in seguito degli hook avanzati. Vediamo alcuni concetti che si applicano a tutti gli hook che creiamo e installiamo.<\/p>\n<h3>Scegliere un tipo di hook appropriato<\/h3>\n<p>L&#8217;impiego del tipo di hook giusto per il proprio caso d&#8217;uso specifico \u00e8 un primo passo importante da compiere. Innanzitutto, \u00e8 necessario capire il vostro workflow e le vostre esigenze di sviluppo. Ecco una rapida lista di considerazioni a riguardo:<\/p>\n<ul>\n<li>Innanzitutto, considerate le varie fasi del vostro processo, come la <a href=\"https:\/\/kinsta.com\/it\/blog\/git-per-lo-sviluppo-web\/\">codifica, i test e la distribuzione<\/a>. Inoltre, individuate i punti in cui il processo potrebbe trarre vantaggio dall&#8217;<a href=\"https:\/\/kinsta.com\/it\/changelog\/kinsta-api\/\">automazione<\/a> e dai controlli.<\/li>\n<li>Da l\u00ec, individuate i punti del vostro flusso di lavoro in cui si verificano spesso errori o incongruenze. I Git Hook personalizzati possono essere d&#8217;aiuto in questo caso. Ad esempio, se dimenticate di eseguire i test prima di un commit, un hook pre-commit pu\u00f2 risolvere il problema.<\/li>\n<li>Poi, considerate quando volete eseguire l&#8217;hook all&#8217;interno del flusso di lavoro. Ad esempio, se volete assicurarvi che tutti i commit rispettino <a href=\"https:\/\/kinsta.com\/it\/blog\/best-practice-html\/\">gli standard di codifica<\/a>, un hook pre-commit \u00e8 la soluzione giusta. Se invece volete <a href=\"https:\/\/kinsta.com\/it\/blog\/strumenti-di-revisione-del-codice\/\">convalidare il codice<\/a> prima di inviarlo in remoto, un hook pre-push sar\u00e0 pi\u00f9 adatto.<\/li>\n<li>Infine, assicuratevi che il tipo di hook scelto sia compatibile con il vostro ambiente di sviluppo e con gli strumenti che utilizzate. Considerate il <a href=\"https:\/\/kinsta.com\/it\/blog\/linguaggi-di-scripting\/\">linguaggio di scripting<\/a> che utilizzerete per l&#8217;hook e il suo ambiente di esecuzione.<\/li>\n<\/ul>\n<p>A questo punto, dovreste essere in grado di definire obiettivi chiari per l&#8217;hook. Pu\u00f2 anche darsi che ogni obiettivo richieda un tipo di hook diverso. Tuttavia, anche se la tentazione di creare script per ogni possibile scenario \u00e8 forte, \u00e8 bene concentrarsi prima sui punti critici.<\/p>\n<h3>Dare un nome e posizionare gli hook Git personalizzati<\/h3>\n<p>Denominare e posizionare correttamente gli hook Git personalizzati \u00e8 fondamentale per garantirne la funzionalit\u00e0 e la manutenibilit\u00e0. Come le funzioni, i file, i nomi delle classi e altro ancora del codice, anche gli hook Git dovrebbero avere una convenzione di denominazione coerente e descrittiva.<\/p>\n<p>Se gli hook dovranno supportare pi\u00f9 progetti nel tempo come template, potreste voler utilizzare dei prefissi, magari con le iniziali degli sviluppatori, un dipartimento o il nome di un&#8217;azienda. In generale, i Git Hook utilizzano lettere minuscole e trattini per una maggiore leggibilit\u00e0: ad esempio, <b>mio-progetto-pre-commit<\/b>.<\/p>\n<p>Inoltre, mentre potete memorizzare gli hook Git nella cartella <b>.git\/hooks<\/b> del vostro repo, gli hook <i>personalizzati<\/i> dovrebbero essere inseriti in una cartella separata all&#8217;interno della cartella principale del progetto. In questo modo si eviteranno sovrascritture accidentali durante un aggiornamento di Git. Tuttavia, dovreste implementare il <a href=\"https:\/\/kinsta.com\/it\/blog\/controllo-versioni\/\">controllo di versione<\/a> per questi hook insieme al resto del codice del vostro progetto.<\/p>\n<h3>Come creare un hook Git personalizzato di livello base<\/h3>\n<p>Il modo tipico per scrivere un hook Git di base \u00e8 quello di creare un nuovo file con il nome dell&#8217;hook scelto (ad esempio <b>pre-commit<\/b>) nella directory degli hook. Elencheremo i nomi degli hook pi\u00f9 avanti quando parleremo dei parametri.<\/p>\n<p>Prima di aprire un file per lavorarci, dovete assicurarvi che sia eseguibile utilizzando il seguente frammento di riga di comando:<\/p>\n<pre><code class=\"language-bash\">chmod +x path\/to\/file\/hook-name<\/code><\/pre>\n<p>Ricordatevi di sostituire i placeholder con le informazioni corrette. Faremo riferimento a questo snippet in tutto il post, poich\u00e9 dovrebbe essere un&#8217;azione tipica ogni volta che si crea un nuovo hook Git.<\/p>\n<p>Una volta che il file \u00e8 eseguibile e aperto, aggiungete la vostra logica personalizzata utilizzando il linguaggio di scripting che preferite. Pu\u00f2 trattarsi di Bash, <a href=\"https:\/\/kinsta.com\/it\/blog\/tutorial-python\/\">Python<\/a>, <a href=\"https:\/\/kinsta.com\/it\/blog\/ruby-on-rails-vs-node-js\/\">Ruby<\/a> e altri. La creazione di questi linguaggi va ovviamente al di l\u00e0 dell&#8217;argomento che tratteremo in questa sede. Tuttavia, in seguito sono previsti alcuni esempi di pseudocodice per illustrare casi d&#8217;uso e scenari specifici.<\/p>\n<p>Infine, prima di effettuare il commit di qualsiasi modifica, testate il vostro hook tentando di eseguire l&#8217;azione correlata (come ad esempio il commit). Questo \u00e8 l&#8217;approccio di base alla creazione di Git Hook, ma ci sono molti casi d&#8217;uso avanzati. Li analizzeremo nel prossimo paragrafo.<\/p>\n<h2>Come creare e installare hook personalizzati avanzati<\/h2>\n<p>La creazione di Git Hook di livello base sar\u00e0 un&#8217;attivit\u00e0 che eseguirete spesso nel corso della vostra carriera di sviluppatori. Tuttavia, in molte situazioni sono necessari hook pi\u00f9 avanzati e complessi. Di seguito vedremo alcuni casi d&#8217;uso e alcuni esempi di hook per una serie di scenari comuni.<\/p>\n<h3>Creare un hook che imponga lo stile del codice usando i linter<\/h3>\n<p>L&#8217;utilizzo di un linter per imporre lo stile del codice \u00e8 un&#8217;applicazione fantastica per gli hook di Git. Pu\u00f2 aiutare a mantenere la qualit\u00e0 del codice coerente in tutto il repository e dovrebbe essere un&#8217;applicazione molto utile.<\/p>\n<p>Naturalmente, dovrete scegliere un linter che si adatti al linguaggio di programmazione del vostro progetto. Ad esempio, <a href=\"https:\/\/pypi.org\/project\/black\/\" target=\"_blank\" rel=\"noopener noreferrer\">Black<\/a> \u00e8 fantastico per Python. Qui useremo <a href=\"https:\/\/eslint.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">ESLint<\/a> per JavaScript per creare un hook di pre-commit.<\/p>\n<p>Per prima cosa, installate il linter come pacchetto globale o locale all&#8217;interno del vostro progetto. A tal fine avrete bisogno di <a href=\"https:\/\/nodejs.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Node.js<\/a> e <a href=\"https:\/\/www.npmjs.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">npm<\/a>:<\/p>\n<pre><code class=\"language-bash\">npm install eslint --save-dev<\/code><\/pre>\n<p>Successivamente, andate alla directory degli hooks all&#8217;interno del vostro repo. Create il vostro file di pre-commit, quindi scrivete uno script che esegua il linter sui vostri file in fase di stage. L&#8217;hook deve impedire il commit se il linter trova dei problemi. Ecco un esempio approssimativo:<\/p>\n<pre><code class=\"language-bash\">#!\/bin\/sh\n\n# Stash unstaged changes (optional but recommended)\ngit stash -q --keep-index\n\n# Run the linter on staged files\nnpm run lint # Replace with the appropriate linting command\nLINT_RESULT=$?\n\n# Unstash the stashed changes (optional but recommended)\ngit stash pop -q\n\n# Exit with the linter's exit code\nexit $LINT_RESULT<\/code><\/pre>\n<p>Una volta che vi sarete assicurati che l&#8217;hook sia eseguibile, testatelo con un commit. L&#8217;hook pre-commit dovrebbe eseguire il linter. Se ci sono violazioni dello stile del codice, non potrete completare il commit finch\u00e9 non avrete risolto i problemi.<\/p>\n<p>Naturalmente, dovreste scrivere un hook che funzioni con il vostro <a href=\"https:\/\/kinsta.com\/it\/blog\/miglior-linguaggio-di-programmazione\/\">linguaggio di programmazione<\/a> e il vostro linter, in base al vostro progetto. Ad esempio, potreste estendere questo esempio con le impostazioni di configurazione di linter, integrandolo con il vostro processo di build e altro ancora.<\/p>\n<h3>Implementare un hook per eseguire i test prima di un commit<\/h3>\n<p>L&#8217;implementazione di un hook pre-commit per eseguire i test prima di un commit \u00e8 un modo eccellente per individuare tempestivamente eventuali problemi. In questo modo, potrete assicurarvi di eseguire il commit solo di codice affidabile.<\/p>\n<p>Per questo esempio, utilizzeremo il <a href=\"https:\/\/jestjs.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">framework di testing Jest<\/a> per JavaScript. Dovrete installare qualcosa di adatto al vostro progetto (come sempre):<\/p>\n<pre><code class=\"language-bash\">npm install jest --save-dev<\/code><\/pre>\n<p>Come per ogni hook, andate nella cartella degli hook, create un nuovo file, dategli un nome e rendetelo eseguibile. Da qui, scrivete uno script che esegua i test su tutti i file in fase di commit. Ecco un modello approssimativo:<\/p>\n<pre><code class=\"language-bash\">#!\/bin\/sh\n\n# Stash unstaged changes (optional but recommended)\ngit stash -q --keep-index\n\n# Run tests on staged files\nnpm test # Replace with the appropriate test command\nTEST_RESULT=$?\n\n# Unstash the stashed changes (optional but recommended)\ngit stash pop -q\n\n# Exit with the test's exit code\nexit $TEST_RESULT<\/code><\/pre>\n<p>Quando si tenta di eseguire il commit delle modifiche, l&#8217;hook eseguir\u00e0 i test sui file in fase di stage. Il commit si interromper\u00e0 per qualsiasi test fallito e dovrete risolvere i problemi prima di eseguire nuovamente il commit.<\/p>\n<h3>Sviluppare un hook per automatizzare il versioning e il tagging<\/h3>\n<p>Un modo eccellente per semplificare il processo di rilascio \u00e8 automatizzare il versioning e il tagging all&#8217;interno di Git. In questo modo si garantir\u00e0 un versioning coerente in tutta la base di codice.<\/p>\n<p>Per iniziare, scegliete uno schema di versioning adatto al vostro progetto. Questo esula dallo scopo dell&#8217;articolo, ma gli schemi pi\u00f9 comuni includono il Semantic Versioning (SemVer) o un modello di versioning personalizzato.<\/p>\n<p>Poi, decidete esattamente cosa far\u00e0 il vostro hook. Ad esempio, potrebbe leggere la versione corrente, incrementarla secondo lo schema scelto e aggiornare i file necessari con la nuova versione. Dovrete anche scrivere uno script per la creazione di tag in base alla versione che utilizzi i comandi Git per creare tag leggeri o annotati.<\/p>\n<p>Una volta creati e impostati i permessi per il vostro file, potete iniziare a scrivere il vostro hook. Pu\u00f2 trattarsi di un hook complesso e molto specifico che pu\u00f2 anche cambiare da progetto a progetto. Tuttavia, la maggior parte degli hook di questo tipo include i seguenti elementi:<\/p>\n<ul>\n<li>Una funzione che incrementa una parte specifica di una stringa di versione (ad esempio, <code>1.2.3<\/code>) e restituisce la nuova versione.<\/li>\n<li>La possibilit\u00e0 di leggere la versione corrente da un file di versione dedicato.<\/li>\n<li>Una funzione per calcolare il nuovo numero di versione, compresa la parte specifica da incrementare. Ad esempio, <code>0<\/code> per major, <code>1<\/code> per minor, <code>2<\/code> per patch.<\/li>\n<\/ul>\n<p>Da qui, lo script deve aggiornare il file di versione con il nuovo numero, creare un tag leggero con la nuova versione e, facoltativamente, inviare il nuovo tag a un repository remoto. Una volta effettuate le modifiche, l&#8217;hook far\u00e0 in modo che ogni commit sia associato a una versione e a un tag appropriati.<\/p>\n<p>Probabilmente vorrete adattare ulteriormente questo hook alle esigenze del vostro progetto. Ad esempio, potreste gestire casi come la creazione di tag iniziali, la gestione dei conflitti di versione e l&#8217;aggiornamento dei riferimenti di versione nei file.<\/p>\n<h2>Capire i parametri dell&#8217;hook e le variabili d&#8217;ambiente<\/h2>\n<p>Uno dei motivi per cui gli hook di Git sono cos\u00ec potenti \u00e8 il modo in cui gestiscono le variabili dinamiche. Tuttavia, questo pu\u00f2 essere un concetto complesso da comprendere. Di seguito analizzeremo sia le variabili d&#8217;ambiente che i parametri degli hook, iniziando da questi ultimi.<\/p>\n<h3>Come i parametri passano agli hook<\/h3>\n<p>Gli hook possono ricevere parametri specifici da Git per accedere a informazioni contestuali dalla vostra base di codice principale. Git imposta i parametri in modo automatico al momento dell&#8217;esecuzione e, sebbene nella maggior parte dei casi non sia necessario definirli, potrebbe essere necessario dichiararli. \u00c8 essenziale comprenderli per sviluppare degli hook efficaci.<\/p>\n<p>Ecco una panoramica dei punti chiave dei parametri degli hook:<\/p>\n<ul>\n<li>Gli hook di Git utilizzano variabili posizionali, dove <code>$1<\/code> si riferisce al primo parametro, <code>$2<\/code> al secondo parametro e cos\u00ec via. Questi parametri non sono arbitrari: hanno significati e scopi specifici. Per questo motivo, anche se non sono &#8220;ufficiali&#8221;, rappresentano delle convenzioni accettate per accedere ai valori dei parametri.<\/li>\n<li>L&#8217;ordine dei parametri segue uno schema specifico. Git passa questi parametri al vostro script hook in un ordine predeterminato basato sul contesto dell&#8217;evento hook.<\/li>\n<li>I nomi delle variabili riflettono lo scopo generale dei parametri. Ad esempio, <code>$1<\/code> spesso contiene il percorso di un file mentre <code>$2<\/code> potrebbe essere la fonte di un&#8217;azione.<\/li>\n<\/ul>\n<p>Se doveste aggiungere un parametro che l&#8217;hook non pu\u00f2 chiamare, lo script non sar\u00e0 generalmente in grado di utilizzarlo. I parametri sono specifici per un particolare hook e contesto di esecuzione. Per evitare problemi, dovreste utilizzare solo parametri documentati. Tuttavia, <i>potete<\/i> assegnare il valore di un parametro posizionale a un&#8217;altra variabile e poi utilizzarlo nel vostro script:<\/p>\n<pre><code class=\"language-bash\">#!\/bin\/sh\n\n# Assign $1 to the variable EXAMPLE\nEXAMPLE=$1\n\n# Use EXAMPLE variable\necho \"The commit message file is: $EXAMPLE\"<\/code><\/pre>\n<p>In questo caso, la variabile <code>EXAMPLE<\/code> avr\u00e0 lo stesso valore di <code>$1<\/code>, che \u00e8 il percorso del file del messaggio di commit. Tuttavia, l&#8217;utilizzo dei nomi delle variabili documentati rende il codice pi\u00f9 comprensibile.<\/p>\n<p>Tenete presente che in alcuni casi utilizzerete lo <a href=\"https:\/\/www.computerhope.com\/jargon\/s\/stdin.htm\">standard input (<code>stdin<\/code>)<\/a> per definire i parametri, nel qual caso dovrete inserire questi elementi nei vostri hook.<\/p>\n<h4>Trovare i valori e le definizioni dei parametri degli hook Git<\/h4>\n<p>Poich\u00e9 ogni hook di Git avr\u00e0 i suoi parametri, \u00e8 probabile che abbiate bisogno di un riferimento per sapere quali sono per la vostra specifica applicazione. La buona notizia \u00e8 che ci sono alcuni modi per farlo.<\/p>\n<p>Ad esempio, la <a href=\"https:\/\/git-scm.com\/docs\/githooks\">documentazione ufficiale degli hook Git<\/a> include alcuni dei parametri pi\u00f9 comuni. Tuttavia, l&#8217;approccio migliore \u00e8 quello di aprire uno dei Git hook di esempio. Questi consistono in una mini-guida su come eseguire lo script dell&#8217;hook e includono le definizioni dei parametri:<\/p>\n<figure id=\"attachment_166982\" aria-describedby=\"caption-attachment-166982\" style=\"width: 1000px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-166982 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/10\/sample-git-hook.png\" alt=\"Un esempio di file Git hook in NeoVim su macOS. Mostra una sezione commentata che spiega come codificare l'hook, insieme ai parametri dedicati utilizzabili all'interno. C'\u00e8 anche un esempio parziale di codice bash per l'hook.\" width=\"1000\" height=\"785\"><figcaption id=\"caption-attachment-166982\" class=\"wp-caption-text\">Un file di esempio di hook Git in NeoVim.<\/figcaption><\/figure>\n<p>Questi esempi sono un ottimo modo per familiarizzare con gli hook Git e possono anche farvi fare un po&#8217; di strada quando si tratta di codificarli.<\/p>\n<h3>Variabili d&#8217;ambiente<\/h3>\n<p>I Git Hook possono recuperare argomenti da quelli della riga di comando e da <code>stdin,<\/code>, come abbiamo detto. Tuttavia, possono anche recuperare argomenti dall&#8217;ambiente stesso mentre viene eseguito all&#8217;interno della shell <code>bash<\/code>.<\/p>\n<p>Queste <a href=\"https:\/\/kinsta.com\/it\/blog\/cosa-sono-le-variabili-d-ambiente\/\">variabili d&#8217;ambiente<\/a> permettono di personalizzare il comportamento dei vostri Git Hook e di prendere decisioni basate su vari aspetti del flusso di lavoro Git. In questo modo, potete creare dei Git Hook dinamici e consapevoli del contesto. Ad esempio, potete usarli per convalidare i messaggi di commit, controllare l&#8217;accesso a branch specifici o attivare azioni personalizzate in base all&#8217;identit\u00e0 dell&#8217;autore.<\/p>\n<p>Elencare tutte le variabili d&#8217;ambiente va oltre lo scopo di questo post. Vi consigliamo di consultare la <a href=\"https:\/\/git-scm.com\/book\/en\/v2\/Git-Internals-Environment-Variables\" target=\"_blank\" rel=\"noopener noreferrer\">documentazione di Git<\/a> e gli hook di esempio per avere indicazioni sulle variabili da utilizzare.<\/p>\n<h3>Testare i valori delle variabili d&#8217;ambiente<\/h3>\n<p>In genere Git imposta automaticamente diverse variabili d&#8217;ambiente a seconda dell&#8217;hook che chiama. Questo pu\u00f2 causare dei problemi se non siete a conoscenza delle variabili impostate. Ad esempio, prendiamo il seguente risultato per la variabile <code>GIT_REFLOG_ACTION<\/code> per gli hook pre-rebase e post-merge:<\/p>\n<ul>\n<li><code>pre-rebase<\/code>. <code>GIT_REFLOG_ACTION=rebase<\/code><\/li>\n<li><code>post-merge<\/code>. <code>GIT_REFLOG_ACTION=\u2019pull other master\u2019<\/code><\/li>\n<\/ul>\n<p>Fortunatamente, c&#8217;\u00e8 un modo per <a href=\"https:\/\/longair.net\/blog\/2011\/04\/09\/missing-git-hooks-documentation\/\" target=\"_blank\" rel=\"noopener noreferrer\">verificare cosa fa Git<\/a> con le variabili d&#8217;ambiente utilizzando un piccolo snippet all&#8217;interno del vostro hook:<\/p>\n<pre><code class=\"language-bash\">#!\/bin\/bash\n\necho Running $BASH_SOURCE\nset | egrep GIT\necho PWD is $PWD<\/code><\/pre>\n<p>Per riassumere il codice, la riga due stampa lo script in esecuzione; la riga tre imposta tutte le variabili d&#8217;ambiente da visualizzare, quindi filtra quelle con &#8220;GIT&#8221; nel nome; la riga quattro stampa la directory di lavoro corrente.<\/p>\n<p>Una volta eseguito, vedrete l&#8217;output corrispondente alle variabili d&#8217;ambiente associate al vostro hook. Da qui avrete le conoscenze necessarie per assicurarvi che i vostri Git Hook possano utilizzare le variabili d&#8217;ambiente nel modo che preferite.<\/p>\n<h2>Consigli e trucchi per gestire e condividere i vostri Git Hook<\/h2>\n<p>La gestione degli hook Git all&#8217;interno di un team o di un&#8217;azienda \u00e8 fondamentale per garantire pratiche di sviluppo coerenti e automatizzare i <a href=\"https:\/\/kinsta.com\/it\/blog\/workflow-wordpress\/\">flussi di lavoro<\/a> in modo efficiente. Per esempio, prendiamo il semplice atto di assegnare una directory dedicata agli hook. Possiamo darvi due consigli:<\/p>\n<ul>\n<li>Create un repository centrale o una posizione condivisa in cui memorizzare gli hook standardizzati. Potete riutilizzare questi hook in pi\u00f9 progetti e clonare o collegare il repository per avere un accesso globale.<\/li>\n<li>Organizzate i vostri hook in un registro o in una struttura di directory. In questo modo il vostro team potr\u00e0 trovare e utilizzare facilmente gli hook di cui ha bisogno.<\/li>\n<\/ul>\n<p>Pi\u00f9 \u00e8 probabile che gli hook vengano utilizzati in pi\u00f9 progetti, maggiore \u00e8 l&#8217;importanza della documentazione. dovreste mantenere una documentazione completa che illustri lo scopo, l&#8217;uso e le opzioni di configurazione di ogni hook all&#8217;interno del repo. Anche le revisioni del codice e le strategie di aggiornamento per questi hook globali saranno essenziali.<\/p>\n<p>Vi consigliamo anche di archiviare gli hook personalizzati nel sistema di controllo delle versioni (VCS) insieme alla base di codice del vostro progetto. In questo modo si garantisce che tutto il team abbia accesso all&#8217;intera libreria di hook.<\/p>\n<h3>Usare gli hook Git lato server<\/h3>\n<p>Gli hook lato server vengono eseguiti sul server che ospita il repo Git centrale. In questo modo, potete applicare le politiche, eseguire controlli o attivare azioni sul lato server.<\/p>\n<p>Avete due opzioni di archiviazione per i vostri hook lato server: all&#8217;interno del VCS insieme al vostro progetto o in repository separati.<\/p>\n<h4>Memorizzare gli hook lato server usando un VCS<\/h4>\n<p>L&#8217;utilizzo del VCS per memorizzare gli hook <a href=\"https:\/\/kinsta.com\/it\/blog\/architettura-applicazioni-web\/\">lato server<\/a> presenta due vantaggi. Innanzitutto, potete assicurarvi che gli hook abbiano lo stesso versioning e la stessa manutenzione del resto della base di codice. In secondo luogo, dovrete clonare un solo repository per accedere sia al codice del progetto che agli hook.<\/p>\n<p>Tuttavia, a seconda della natura degli hook specifici, archiviarli nello stesso repository potrebbe sollevare problemi di sicurezza nel caso in cui tali hook accedano a informazioni sensibili. Inoltre, se gli hook sono complessi o richiedono configurazioni specifiche, potrebbe aumentare la complessit\u00e0 del vostro repo principale.<\/p>\n<h4>Conservare gli hook lato server in repository separati<\/h4>\n<p>Mantenere gli hook lato server in repository separati permette di aggiornarli e di modificarli indipendentemente dalla base di codice, riducendo cos\u00ec i potenziali conflitti. Questa modularit\u00e0 pu\u00f2 offrire una maggiore flessibilit\u00e0.<\/p>\n<p>Inoltre, potete conservare gli hook in repository ad accesso limitato. Questo aiuter\u00e0 a ridurre il rischio di esposizione di dati sensibili.<\/p>\n<p>Al contrario, la gestione di <a href=\"https:\/\/kinsta.com\/it\/blog\/monorepo-vs-multi-repo\/\">pi\u00f9 repository<\/a> potrebbe richiedere uno sforzo aggiuntivo. Inoltre, se gli hook si basano su versioni specifiche della vostra base di codice principale, pu\u00f2 essere difficile coordinare le modifiche tra i repository.<\/p>\n<h3>Automatizzare l&#8217;installazione degli hook<\/h3>\n<p>Automatizzare l&#8217;installazione degli hook su pi\u00f9 repository pu\u00f2 far risparmiare tempo e garantire la coerenza del flusso di sviluppo. Utilizzando script e template, potete impostare facilmente gli hook nei vari repository senza dover intervenire manualmente.<\/p>\n<p>Il processo inizia con un repository dedicato che contiene gli hook globali. Dovrete standardizzarli: per esempio, evitate di codificare percorsi o valori specifici per un singolo repository.<\/p>\n<p>Da qui potete iniziare a scrivere il vostro script di installazione. Ad esempio, il seguente pseudocodice cloner\u00e0 il repo modello di un hook e <a href=\"https:\/\/kinsta.com\/blog\/managing-wordpress-development-with-symlinks\/\">copier\u00e0 (o &#8220;linker\u00e0&#8221;)<\/a> gli hook nella directory <b>.git\/hooks<\/b> di ogni repository:<\/p>\n<pre><code class=\"language-bash\"># Example installation script\n# Usage: .\/install_hooks.sh \/path\/to\/repository\nTEMPLATE_REPO=\"https:\/\/github.com\/yourusername\/hooks-template.git\"\nREPO_PATH=\"$1\"\nREPO_NAME=$(basename \"$REPO_PATH\")\n\n# Clone the template repository\ngit clone --depth 1 \"$TEMPLATE_REPO\" \"$REPO_NAME-hooks\"\n\n# Copy or symlink hooks to the repository\ncp -r \"$REPO_NAME-hooks\/hooks\" \"$REPO_PATH\/.git\/\"\nrm -rf \"$REPO_NAME-hooks\"\necho \"Hooks installed in $REPO_NAME\u201d<\/code><\/pre>\n<p>Una volta salvate le modifiche, potete eseguire lo script di installazione per ogni repo in cui volete installare gli hook:<\/p>\n<pre><code class=\"language-bash\">.\/install_hooks.sh \/path\/to\/repository1\n.\/install_hooks.sh \/path\/to\/repository2\n# \u2026<\/code><\/pre>\n<p>Apportate le modifiche nel repository del modello ogni volta che avete bisogno di aggiornare o aggiungere gli hook. La volta successiva che eseguirete lo script di installazione in un repository, gli hook aggiornati verranno installati.<\/p>\n<h3>Template Git<\/h3>\n<p>I template Git permettono di definire hook e configurazioni comuni per i nuovi repository. Forniscono un approccio sistematico per aiutarvi ad automatizzare le impostazioni, le configurazioni e altri elementi quando create o clonate nuovi repository. In questo modo potete assicurarvi che ogni repository aderisca alle vostre pratiche tipiche e consolidate.<\/p>\n<p>Una volta creata una directory template e aggiunti gli script hook, potete configurare Git in modo che utilizzi la directory come modello per i nuovi repository. Potete impostarlo su base globale o locale per ogni utente.<\/p>\n<p>Per le configurazioni globali, puntate alla cartella template hooks:<\/p>\n<pre><code class=\"language-bash\">git config --global init.templateDir \/path\/to\/hooks-template<\/code><\/pre>\n<p>Per le configurazioni locali, potete specificare il repo esatto:<\/p>\n<pre><code class=\"language-bash\">git init --template=\/path\/to\/hooks-template<code><\/code><\/code><\/pre>\n<p>Ogni volta che create un nuovo repository usando <code>git init<\/code> o clonate un repository esistente, Git copier\u00e0 automaticamente il contenuto della directory degli hook template nella directory <b>.git<\/b> del nuovo repo.<\/p>\n<p>Infine, mentre gli hook template possono essere generici, \u00e8 anche possibile consentire la personalizzazione degli hooks in base a esigenze specifiche. Ad esempio, uno script potrebbe verificare la presenza di un file di configurazione degli hook specifico per il repository e utilizzarlo se presente.<\/p>\n<h2>Pratiche comuni per mantenere sicuri gli hook Git<\/h2>\n<p>L&#8217;uso degli hook Git pu\u00f2 essere molto utile per l&#8217;automazione dei processi e l&#8217;applicazione delle pratiche pi\u00f9 comuni. Tuttavia, questo pu\u00f2 comportare la possibilit\u00e0 di introdurre vulnerabilit\u00e0 se non si gestiscono bene gli hook.<\/p>\n<p>Ecco un rapido elenco di pratiche che potreste implementare per i vostri hook:<\/p>\n<ul>\n<li>Assicuratevi di controllare e limitare i <a href=\"https:\/\/docs.sevalla.com\/applications\/git\/github#authenticate-and-authorize\">permessi<\/a> per gli hook, soprattutto se si tratta di esempi di terze parti.<\/li>\n<li>Convalidate e sanificate sempre i parametri di input per evitare le <a href=\"https:\/\/kinsta.com\/it\/blog\/sql-injection\/\">iniezioni di codice<\/a>. Utilizzate pratiche sicure, come ad esempio evitare l&#8217;uso diretto di input dell&#8217;utente nei vostri script.<\/li>\n<li>Assicuratevi che gli hook non includano informazioni riservate. In questo caso le variabili d&#8217;ambiente o l&#8217;archiviazione sicura offrono un valore immenso.<\/li>\n<li>Esaminate e testate regolarmente gli hook per evitare un consumo involontario di risorse. Questo potrebbe portare ad attacchi <a href=\"https:\/\/kinsta.com\/it\/blog\/attacchi-ddos\/\">DDoS (Distributed Denial of Service)<\/a>.<\/li>\n<\/ul>\n<p>Dovrete anche implementare un processo di test e revisione completo e approfondito. Questo vi aiuter\u00e0 a ridurre le vulnerabilit\u00e0 e altri errori in futuro.<\/p>\n<h3>Convalida<\/h3>\n<p>A questo punto, dovremmo parlare dell&#8217;implementazione di una corretta convalida e <a href=\"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/\">gestione degli errori<\/a> per i vostri hook. Questo \u00e8 fondamentale per garantire affidabilit\u00e0, stabilit\u00e0 e sicurezza.<\/p>\n<p>Ad esempio, dovete sempre convalidare tutti gli input o i parametri che i vostri script hook ricevono. Tuttavia, potete fare molto di pi\u00f9 per garantire una buona validazione. Potete assicurarvi che il repository sia nello stato previsto per l&#8217;esecuzione dell&#8217;hook. Ad esempio, in un hook pre-commit, controllate che i file necessari siano in fase di staging prima del commit.<\/p>\n<figure id=\"attachment_166983\" aria-describedby=\"caption-attachment-166983\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-166983\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/10\/hook-exit-code.png\" alt=\"Una parte dell'applicazione iTerm per macOS, che mostra un esempio di hook Git aperto in una finestra NeoVim. \u00c8 presente una piccola sezione di codice per un hook pre-push, con un codice di uscita 0 alla fine della suite.\" width=\"1000\" height=\"487\"><figcaption id=\"caption-attachment-166983\" class=\"wp-caption-text\">Una parte di un file di hook Git che mostra il codice di uscita 0 come riga finale.<\/figcaption><\/figure>\n<p>Anche la gestione degli errori sar\u00e0 preziosa. I codici di uscita sono fondamentali sia negli hook che nella base di codice, cos\u00ec come i log degli errori e i messaggi di errore informativi. L&#8217;obiettivo dovrebbe essere il &#8220;Graceful failure&#8221;, come nel caso di codebase pi\u00f9 grandi.<\/p>\n<p>Naturalmente, in uno scenario reale, i vostri hook potrebbero richiedere una convalida pi\u00f9 complessa e una logica di gestione degli errori. Ci\u00f2 significa che i test regolari sono ancora pi\u00f9 importanti.<\/p>\n<h3>Azioni distruttive accidentali<\/h3>\n<p>Gli incidenti possono capitare, quindi impostare i vostri Git Hook in modo da prevenire queste azioni distruttive indesiderate \u00e8 fondamentale per salvaguardare i dati da perdite o danni. Gli hook possono essenzialmente fungere da reti di sicurezza attraverso la segnalazione da parte dell&#8217;utente di azioni potenzialmente dannose.<\/p>\n<p>Gli hook di pre-ricezione e di pre-commit funzionano bene in questo caso. Vediamo rapidamente come entrambi possono essere utili:<\/p>\n<ul>\n<li><b>Gli hook di pre-ricezione sono utili per i controlli sul lato server.<\/b> Si attivano prima di accettare nuovi branch o tag dal client. Il vostro script dovrebbe esaminare i riferimenti in arrivo, verificare la presenza di azioni come il force push o la cancellazione di branch e chiedere all&#8217;utente una conferma. Dovrete anche analizzare i riferimenti spinti per determinare se comportano azioni come il force pushing (<code>--force<\/code>) o la <a href=\"https:\/\/kinsta.com\/it\/blog\/git-delete-branch-locale\/\">cancellazione di branch<\/a>.<\/li>\n<li><b>Gli hook di pre-commit funzionano sul lato client e vengono eseguiti prima di finalizzare un commit.<\/b> Anche se non impediscono direttamente azioni distruttive sul server, <i>possono<\/i> aiutare a prevenire errori locali prima del push. Il vostro script deve analizzare le modifiche in fase di elaborazione e cercare elementi come i comandi di <code>force push<\/code> nei messaggi di commit. A questo punto, mostrate un messaggio di avvertimento o di errore per l&#8217;utente.<\/li>\n<\/ul>\n<p>Tuttavia, a prescindere dalle pratiche che implementerete, queste devono essere sicure, efficienti e ottimali per le vostre esigenze. Per questo \u00e8 necessaria una strategia di revisione e test approfondita.<\/p>\n<h3>Revisione e test degli hook Git<\/h3>\n<p>La revisione e il test degli hook sono essenziali per garantire che funzionino correttamente e che siano in linea con il vostro flusso di sviluppo. Le peer review, una documentazione chiara, l&#8217;abbondanza di commenti e altro ancora possono aiutare a garantire che gli hook siano pronti per la produzione.<\/p>\n<p>Quando si tratta di testare, \u00e8 importante farlo in modo isolato utilizzando dati campione diversi. Potreste anche implementare test di regressione o di integrazione automatizzati.<\/p>\n<p>Infine, vi consigliamo di testare gli hook in ambienti diversi (come i <a href=\"https:\/\/kinsta.com\/it\/docs\/hosting-wordpress\/ambienti-di-staging\/#push-staging-to-live-1\">server<\/a> di <a href=\"https:\/\/kinsta.com\/it\/devkinsta\/\">sviluppo<\/a>, di <a href=\"https:\/\/kinsta.com\/it\/hosting-wordpress\/staging\/\">staging<\/a> e di <a href=\"https:\/\/kinsta.com\/it\/docs\/hosting-wordpress\/ambienti-di-staging\/#push-staging-to-live-1\">produzione<\/a>) per assicurarvi che abbiano un comportamento coerente. Una configurazione di log in tempo reale vi aiuter\u00e0 in questo senso, in quanto pu\u00f2 mostrare cosa succede quando i dati si spostano da un server all&#8217;altro.<\/p>\n<h2>Come risolvere i problemi degli hook<\/h2>\n<p>Come in ogni base di codice, anche in questo caso potreste dover risolvere problemi legati agli hook, anche con diversi tentativi. Infatti, a prescindere dal tipo di hook Git, troverete sempre gli stessi errori. Molti di questi sono semplici problemi che riguardano tutti i tipi di progetti, come errori di sintassi, problemi di permessi, utilizzo di percorsi relativi o hardcoded e molto altro ancora.<\/p>\n<p>Tuttavia, \u00e8 una buona idea controllare che non ci siano dipendenze mancanti, poich\u00e9 alcuni hook si basano su strumenti, file o librerie esterne. Per questo motivo, dovete renderli disponibili nell&#8217;ambiente in cui eseguite l&#8217;hook.<\/p>\n<p>Ci sono per\u00f2 dei problemi specifici che possono verificarsi con gli hook di Git. Ad esempio, gli hook dovrebbero uscire con un codice di stato diverso da zero per indicare un fallimento. Inoltre, gli hook non dovrebbero contenere loop infiniti. Senza questi due elementi, potreste causare un comportamento inaspettato e interrompere il workflow.<\/p>\n<p>Potreste anche scoprire che i conflitti tra due hook provocano interazioni e conseguenze indesiderate. Anche le cosiddette <a href=\"https:\/\/www.techtarget.com\/searchstorage\/definition\/race-condition\" target=\"_blank\" rel=\"noopener noreferrer\">&#8220;race condition&#8221;<\/a> possono ostacolare le vostre aspettative. Questo accade quando due o pi\u00f9 hook si attivano attraverso eventi simili, ma uno si completa prima dell&#8217;altro: questo avr\u00e0 un impatto sul risultato finale che vi aspettate.<\/p>\n<p>\u00c8 qui che le revisioni e i test diventano fondamentali. Anche il mantenimento della documentazione \u00e8 importante per evitare problemi e garantire che gli hook funzionino come ci si aspetta.<\/p>\n<p>A proposito di documentazione, il <a href=\"https:\/\/git-scm.com\/book\/en\/v2\/Customizing-Git-Git-Hooks\" target=\"_blank\" rel=\"noopener noreferrer\">materiale di riferimento di Git<\/a> \u00e8 una lettura essenziale. In effetti, insieme a questo articolo e forse al sito indipendente della guida agli <a href=\"https:\/\/githooks.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">hook di Git<\/a> (utilizzando <a href=\"https:\/\/kinsta.com\/it\/blog\/github-pages\/\">GitHub Pages<\/a>), non dovreste aver bisogno di molto altro materiale da leggere.<\/p>\n<figure id=\"attachment_166984\" aria-describedby=\"caption-attachment-166984\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-166984\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/10\/git-hooks-website.png\" alt=\"Il sito web di Git Hooks di terze parti, che mostra un'introduzione agli hook e una spiegazione. Utilizza testo nero su sfondo bianco. Nell'angolo \u00e8 presente il simbolo di GitHub, che indica che il sito \u00e8 ospitato su GitHub Pages.\" width=\"1000\" height=\"571\"><figcaption id=\"caption-attachment-166984\" class=\"wp-caption-text\">Il sito web della guida GitHooks.<\/figcaption><\/figure>\n<p>Tuttavia, potreste voler dare un&#8217;occhiata anche alle applicazioni che aiutano a gestire i Git hook. <a href=\"https:\/\/github.com\/evilmartians\/lefthook\" target=\"_blank\" rel=\"noopener noreferrer\">Lefthook<\/a> ha aggiornamenti regolari e un sacco di supporto su GitHub, mentre <a href=\"https:\/\/typicode.github.io\/husky\/\" target=\"_blank\" rel=\"noopener noreferrer\">Husky<\/a> \u00e8 ottimo per il linting dei messaggi di commit.<\/p>\n<h2>I vantaggi dell&#8217;integrazione degli hooks nelle pipeline di integrazione continua (CI\/CD)<\/h2>\n<p>Le pipeline CI\/CD funzionano bene con gli hook di Git, in quanto questi script possono aiutarvi ad automatizzare le attivit\u00e0, garantire una qualit\u00e0 costante e fornire controlli di sicurezza.<\/p>\n<p>Ad esempio, gli hook pre-commit vi permettono di eseguire controlli di qualit\u00e0 del codice, come il linting, l&#8217;analisi statica e la formattazione. Per quanto riguarda i test, potete attivare test unitari, suite di test o altri controlli automatizzati nella fase di pre-commit. Inoltre, gli hook pre-push vi permettono di eseguire test di integrazione, <a href=\"https:\/\/kinsta.com\/it\/blog\/controlli-sicurezza-siti-web\/\">scansioni di sicurezza<\/a> e altro ancora.<\/p>\n<p>Sono molti i vantaggi che potete trarre dall&#8217;uso degli hook nelle vostre pipeline CI\/CD:<\/p>\n<ul>\n<li><b>Coerenza.<\/b> Gli hook permettono di applicare pratiche coerenti in tutti i commit e le distribuzioni, riducendo cos\u00ec gli errori.<\/li>\n<li><b>Controlli automatizzati.<\/b> Potete automatizzare i controlli di qualit\u00e0 del codice, i test, le scansioni di sicurezza e altre attivit\u00e0 importanti. In questo modo ridurrete lo sforzo manuale e avrete pi\u00f9 tempo da dedicare ad altre attivit\u00e0.<\/li>\n<li><b>Rilevamento precoce dei problemi.<\/b> Gli hook vi permetteranno di individuare i problemi nelle prime fasi del processo di sviluppo, evitando che si propaghino nella pipeline.<\/li>\n<li><b>Riduzione dei rischi di distribuzione.<\/b> Grazie ai controlli e ai test automatici attivati dagli hook, il rischio di distribuire codice difettoso pu\u00f2 essere ridotto in modo significativo.<\/li>\n<\/ul>\n<p>Poich\u00e9 <a href=\"https:\/\/kinsta.com\/it\/docs\/kinsta-api\/\">l&#8217;API di Kinsta<\/a> permette di <a href=\"https:\/\/kinsta.com\/it\/blog\/come-creare-una-pipeline-ci-cd\/\">impostare pipeline CI\/CD<\/a>, potete integrare anche gli hook Git. Kinsta vi permette di scaricare l&#8217;<a href=\"https:\/\/kinsta.com\/it\/docs\/hosting-wordpress\/gestione-sito\/git\/\">intero repo<\/a> da una postazione remota e consente di effettuare push utilizzando un plugin di terze parti come <a href=\"https:\/\/wppusher.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">WP Pusher<\/a>.<\/p>\n<figure id=\"attachment_166985\" aria-describedby=\"caption-attachment-166985\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-166985\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/10\/wppusher-home-page.png\" alt=\"La home page di WP Pusher con uno sfondo blu, che mostra la tagline e la descrizione del plugin e una schermata delle impostazioni nella bacheca di WordPress.\" width=\"1000\" height=\"525\"><figcaption id=\"caption-attachment-166985\" class=\"wp-caption-text\">La pagina iniziale di WP Pusher.<\/figcaption><\/figure>\n<p>Naturalmente, ci\u00f2 significa che avete anche la possibilit\u00e0 di utilizzare i Git hook. In questo modo, la vostra installazione di Kinsta pu\u00f2 sfruttare questi potenti script all&#8217;interno del vostro repo.<\/p>\n<h2>Riepilogo<\/h2>\n<p><a href=\"https:\/\/git-scm.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Git<\/a> \u00e8 uno strumento essenziale per qualsiasi progetto di sviluppo, ma un aspetto in particolare potrebbe sovraccaricare il vostro workflow di codifica e distribuzione. Gli hook di Git permettono di creare script utilizzando diversi linguaggi per automatizzare vari aspetti del processo di controllo delle versioni. Si tratta di un concetto semplice con un retroterra un po&#8217; complesso.<\/p>\n<p>Il nostro post mostra come utilizzare tecniche avanzate per sfruttare al meglio i Git hooks. Potrete usarli sia localmente che lato server, renderli dinamici utilizzando parametri e variabili, lavorare con pi\u00f9 repo remoti e molto altro ancora. A questo punto, possiamo arrivare a suggerire che i Git Hook potrebbero diventare la vostra arma segreta per aumentare la produttivit\u00e0, la qualit\u00e0 del codice e i tempi di realizzazione dei progetti.<\/p>\n<p>Avete qualche domanda sui Git Hook e su come utilizzarli? Fatecelo sapere nella sezione commenti qui sotto!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Git non deve essere necessariamente complesso, ma ci sono alcuni suoi aspetti che sono intricati e che richiedono una comprensione pi\u00f9 approfondita: gli hook di Git, &#8230;<\/p>\n","protected":false},"author":199,"featured_media":74294,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[26233],"class_list":["post-74293","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-git"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Git Hook: tecniche avanzate e best practice<\/title>\n<meta name=\"description\" content=\"Git offre un modo per utilizzare script personalizzati per determinati eventi del repo. Scopri i Git hook, e alcune tecniche avanzate per utilizzarli!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/it\/blog\/git-hook\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Git Hook: tecniche avanzate e best practice\" \/>\n<meta property=\"og:description\" content=\"Git offre un modo per utilizzare script personalizzati per determinati eventi del repo. Scopri i Git hook, e alcune tecniche avanzate per utilizzarli!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/it\/blog\/git-hook\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstaitalia\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-11-13T10:13:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-13T16:29:52+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Jeremy Holcombe\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Git offre un modo per utilizzare script personalizzati per determinati eventi del repo. Scopri i Git hook, e alcune tecniche avanzate per utilizzarli!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeremy Holcombe\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"26 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-hook\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-hook\/\"},\"author\":{\"name\":\"Jeremy Holcombe\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21\"},\"headline\":\"Git Hook: tecniche avanzate e best practice\",\"datePublished\":\"2023-11-13T10:13:33+00:00\",\"dateModified\":\"2023-11-13T16:29:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-hook\/\"},\"wordCount\":5008,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-hook\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg\",\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/git-hook\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-hook\/\",\"url\":\"https:\/\/kinsta.com\/it\/blog\/git-hook\/\",\"name\":\"Git Hook: tecniche avanzate e best practice\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-hook\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-hook\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg\",\"datePublished\":\"2023-11-13T10:13:33+00:00\",\"dateModified\":\"2023-11-13T16:29:52+00:00\",\"description\":\"Git offre un modo per utilizzare script personalizzati per determinati eventi del repo. Scopri i Git hook, e alcune tecniche avanzate per utilizzarli!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-hook\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/git-hook\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-hook\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-hook\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Git\",\"item\":\"https:\/\/kinsta.com\/it\/argomenti\/git\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Git Hook: tecniche avanzate e best practice\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/it\/#website\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluzioni di hosting premium, veloci e sicure\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/it\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstaitalia\/\",\"https:\/\/x.com\/Kinsta_IT\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21\",\"name\":\"Jeremy Holcombe\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g\",\"caption\":\"Jeremy Holcombe\"},\"description\":\"Senior Editor at Kinsta, WordPress Web Developer, and Content Writer. Outside of all things WordPress, I enjoy the beach, golf, and movies. I also have tall people problems.\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/jeremyholcombe\/\"],\"url\":\"https:\/\/kinsta.com\/it\/blog\/author\/jeremyholcombe\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Git Hook: tecniche avanzate e best practice","description":"Git offre un modo per utilizzare script personalizzati per determinati eventi del repo. Scopri i Git hook, e alcune tecniche avanzate per utilizzarli!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/it\/blog\/git-hook\/","og_locale":"it_IT","og_type":"article","og_title":"Git Hook: tecniche avanzate e best practice","og_description":"Git offre un modo per utilizzare script personalizzati per determinati eventi del repo. Scopri i Git hook, e alcune tecniche avanzate per utilizzarli!","og_url":"https:\/\/kinsta.com\/it\/blog\/git-hook\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstaitalia\/","article_published_time":"2023-11-13T10:13:33+00:00","article_modified_time":"2023-11-13T16:29:52+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg","type":"image\/jpeg"}],"author":"Jeremy Holcombe","twitter_card":"summary_large_image","twitter_description":"Git offre un modo per utilizzare script personalizzati per determinati eventi del repo. Scopri i Git hook, e alcune tecniche avanzate per utilizzarli!","twitter_image":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg","twitter_creator":"@Kinsta_IT","twitter_site":"@Kinsta_IT","twitter_misc":{"Scritto da":"Jeremy Holcombe","Tempo di lettura stimato":"26 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/it\/blog\/git-hook\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/blog\/git-hook\/"},"author":{"name":"Jeremy Holcombe","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21"},"headline":"Git Hook: tecniche avanzate e best practice","datePublished":"2023-11-13T10:13:33+00:00","dateModified":"2023-11-13T16:29:52+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/git-hook\/"},"wordCount":5008,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/git-hook\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg","inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/it\/blog\/git-hook\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/it\/blog\/git-hook\/","url":"https:\/\/kinsta.com\/it\/blog\/git-hook\/","name":"Git Hook: tecniche avanzate e best practice","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/git-hook\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/git-hook\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg","datePublished":"2023-11-13T10:13:33+00:00","dateModified":"2023-11-13T16:29:52+00:00","description":"Git offre un modo per utilizzare script personalizzati per determinati eventi del repo. Scopri i Git hook, e alcune tecniche avanzate per utilizzarli!","breadcrumb":{"@id":"https:\/\/kinsta.com\/it\/blog\/git-hook\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/it\/blog\/git-hook\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/blog\/git-hook\/#primaryimage","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/it\/blog\/git-hook\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/it\/"},{"@type":"ListItem","position":2,"name":"Git","item":"https:\/\/kinsta.com\/it\/argomenti\/git\/"},{"@type":"ListItem","position":3,"name":"Git Hook: tecniche avanzate e best practice"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/it\/#website","url":"https:\/\/kinsta.com\/it\/","name":"Kinsta\u00ae","description":"Soluzioni di hosting premium, veloci e sicure","publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/it\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/it\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstaitalia\/","https:\/\/x.com\/Kinsta_IT","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21","name":"Jeremy Holcombe","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g","caption":"Jeremy Holcombe"},"description":"Senior Editor at Kinsta, WordPress Web Developer, and Content Writer. Outside of all things WordPress, I enjoy the beach, golf, and movies. I also have tall people problems.","sameAs":["https:\/\/www.linkedin.com\/in\/jeremyholcombe\/"],"url":"https:\/\/kinsta.com\/it\/blog\/author\/jeremyholcombe\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/74293","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/users\/199"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/comments?post=74293"}],"version-history":[{"count":8,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/74293\/revisions"}],"predecessor-version":[{"id":74392,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/74293\/revisions\/74392"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/74293\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/74293\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/74293\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/74293\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/74293\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/74293\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/74293\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/74293\/translations\/es"},{"href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/74293\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media\/74294"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media?parent=74293"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/tags?post=74293"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/topic?post=74293"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}