SXXXXXXX_GitUtility/manual.md
2025-04-18 12:15:42 +02:00

318 lines
22 KiB
Markdown

**Manuale Utente: Git SVN Sync Tool**
**Indice**
1. [Introduzione](#introduzione)
* [Scopo del Tool](#scopo-del-tool)
* [Funzionalità Principali](#funzionalità-principali)
2. [Prerequisiti](#prerequisiti)
3. [Installazione e Avvio](#installazione-e-avvio)
4. [Concetti Fondamentali](#concetti-fondamentali)
* [Profili di Configurazione](#profili-di-configurazione)
* [Git Bundles](#git-bundles)
5. [Interfaccia Utente (GUI)](#interfaccia-utente-gui)
* [Gestione Profili (Area Superiore)](#gestione-profili-area-superiore)
* [Schede Principali (Notebook)](#schede-principali-notebook)
* [Scheda: Repository / Bundle](#scheda-repository--bundle)
* [Scheda: Backup Settings](#scheda-backup-settings)
* [Scheda: Commit](#scheda-commit)
* [Scheda: Tags](#scheda-tags)
* [Scheda: Branches](#scheda-branches)
* [Scheda: History](#scheda-history)
* [Area Log Applicazione (Inferiore)](#area-log-applicazione-inferiore)
6. [Funzionalità Dettagliate e Flussi di Lavoro](#funzionalità-dettagliate-e-flussi-di-lavoro)
* [Gestione dei Profili](#gestione-dei-profili)
* [Workflow Principale: Sincronizzazione Online/Offline](#workflow-principale-sincronizzazione-onlineoffline)
* [Fase 1: Configurazione Iniziale dei Profili](#fase-1-configurazione-iniziale-dei-profili)
* [Fase 2: Creare il Bundle Iniziale (Macchina Origine)](#fase-2-creare-il-bundle-iniziale-macchina-origine)
* [Fase 3: Clonare dal Bundle (Macchina Destinazione)](#fase-3-clonare-dal-bundle-macchina-destinazione)
* [Fase 4: Lavorare Offline (Macchina Destinazione)](#fase-4-lavorare-offline-macchina-destinazione)
* [Fase 5: Creare Bundle di Aggiornamento (Macchina Destinazione)](#fase-5-creare-bundle-di-aggiornamento-macchina-destinazione)
* [Fase 6: Importare Aggiornamenti (Macchina Origine)](#fase-6-importare-aggiornamenti-macchina-origine)
* [Fase 7: Continuare il Ciclo](#fase-7-continuare-il-ciclo)
* [Backup Manuale](#backup-manuale)
* [Commit Manuale](#commit-manuale)
* [Gestione Tag e Branch](#gestione-tag-e-branch)
* [Modifica di `.gitignore`](#modifica-di-gitignore)
7. [File di Configurazione (`git_svn_sync.ini`)](#file-di-configurazione-git_svn_syncini)
8. [Logging](#logging)
9. [Risoluzione Problemi Comuni](#risoluzione-problemi-comuni)
---
## 1. Introduzione
### Scopo del Tool
Il **Git SVN Sync Tool** (nonostante il nome, focalizzato su Git) è un'applicazione desktop progettata per semplificare la gestione e la sincronizzazione di repository Git locali, con un'attenzione particolare agli scenari in cui è necessario trasferire progetti tra computer con e senza accesso a una rete comune (ad esempio, tra una macchina di sviluppo "online" e una macchina "offline").
Lo strumento utilizza la funzionalità **Git Bundle** per impacchettare l'intera storia e i file di un repository Git in un singolo file, facilitandone il trasferimento tramite supporti esterni (come chiavette USB). Permette inoltre di eseguire le operazioni inverse, aggiornando un repository locale a partire da un file bundle.
### Funzionalità Principali
* **Gestione Profili:** Salva e carica configurazioni diverse (percorsi, nomi file, opzioni) per repository o scenari di sincronizzazione distinti.
* **Creazione Bundle Git:** Genera file bundle (`.bundle`) contenenti tutti i riferimenti (branch, tag) e gli oggetti necessari di un repository Git.
* **Fetch da Bundle Git:** Aggiorna un repository Git locale recuperando le modifiche da un file bundle e tentando un merge automatico.
* **Preparazione Repository:** Inizializza un repository Git in una directory (se non già presente) e configura il file `.gitignore` per ignorare le directory `.svn` (retaggio del nome originale del tool).
* **Backup Automatico/Manuale:** Crea automaticamente (se abilitato) o manualmente backup compressi (ZIP) del repository prima di operazioni critiche come la creazione o il fetch di bundle. Include opzioni per escludere file per estensione e intere directory per nome.
* **Commit Automatico/Manuale:** Esegue automaticamente (se abilitato) o manualmente commit delle modifiche locali prima della creazione di un bundle.
* **Gestione Tag/Branch:** Interfaccia grafica per visualizzare, creare ed effettuare il checkout di tag e branch locali.
* **Visualizzazione Cronologia:** Mostra la cronologia dei commit del repository, con possibilità di filtrarla per branch o tag specifici.
* **Editor `.gitignore`:** Permette di modificare facilmente il file `.gitignore` del repository selezionato.
* **Logging Dettagliato:** Registra tutte le operazioni, output dei comandi Git ed eventuali errori sia su un file (`git_svn_sync.log`) sia in un'area dedicata dell'interfaccia grafica.
## 2. Prerequisiti
Prima di utilizzare il tool, assicurati di avere:
1. **Python:** Versione 3.x installata sul tuo sistema.
2. **Git:** Git deve essere installato e il suo eseguibile deve essere accessibile dalla riga di comando (ovvero, deve essere presente nella variabile d'ambiente `PATH` del sistema). Il tool invoca comandi `git` esternamente.
## 3. Installazione e Avvio
Il tool è uno script Python e non richiede un'installazione complessa.
1. Assicurati che tutti i file sorgente (`.py`) siano nella stessa directory.
2. Apri un terminale o prompt dei comandi.
3. Naviga fino alla directory contenente gli script.
4. Esegui il comando:
```bash
python GitUtility.py
```
5. L'interfaccia grafica dell'applicazione dovrebbe apparire.
## 4. Concetti Fondamentali
### Profili di Configurazione
Un **Profilo** rappresenta un insieme salvato di impostazioni specifiche per un determinato repository o flusso di lavoro. Ogni profilo contiene:
* Percorsi delle directory (repository locale, directory di destinazione dei bundle).
* Nomi dei file bundle (per la creazione e per il fetch).
* Opzioni (backup automatico, commit automatico, esclusioni backup).
* Messaggio di commit predefinito.
L'uso dei profili ti permette di passare rapidamente tra diverse configurazioni senza dover reinserire manualmente tutti i percorsi e le opzioni ogni volta. Esiste un profilo predefinito chiamato `default`.
### Git Bundles
Un **Git Bundle** è un singolo file (`.bundle`) che contiene oggetti Git (commit, alberi, blob) e riferimenti (nomi di branch e tag). È un modo per trasferire la storia e i dati di un repository Git senza richiedere una connessione di rete diretta tra due repository.
* **Creare un Bundle:** Il tool impacchetta il repository corrente (o le sue novità) in un file `.bundle`. Questo file può essere copiato su un supporto esterno.
* **Fetch da Bundle:** Il tool legge un file `.bundle`, importa i suoi contenuti nel repository locale e tenta di integrare (merge) le modifiche nel branch corrente.
## 5. Interfaccia Utente (GUI)
L'interfaccia è organizzata con un'area superiore per la gestione dei profili, un'area centrale a schede (Notebook) per le diverse funzionalità e un'area inferiore per i log.
### Gestione Profili (Area Superiore)
* **Select Profile:** Menù a tendina per scegliere il profilo di configurazione attivo. La selezione di un profilo carica automaticamente le impostazioni associate.
* **Save Profile:** Salva le impostazioni correnti visualizzate nella GUI nel profilo attualmente selezionato. **Ricorda di salvare dopo aver modificato i percorsi o le opzioni!**
* **Add New:** Apre una finestra di dialogo per creare un nuovo profilo. Verrà creato con impostazioni predefinite che potrai poi modificare e salvare.
* **Remove:** Rimuove il profilo attualmente selezionato. Non è possibile rimuovere il profilo `default`.
### Schede Principali (Notebook)
#### Scheda: Repository / Bundle
Questa scheda gestisce i percorsi fondamentali e le azioni principali legate ai bundle.
* **SVN Working Copy Path:** **(Nome Storico)** Inserisci qui il percorso completo della directory principale del tuo **repository Git locale**.
* **Browse...:** Pulsante per cercare la cartella.
* **Indicatore di Stato (quadratino colorato):**
* **Rosso:** La directory specificata non è un repository Git valido o preparato.
* **Green:** La directory è un repository Git valido e pronto per le operazioni.
* **Bundle Target Directory:** Inserisci il percorso della directory dove verranno creati o da cui verranno letti i file bundle (es. la root di una chiavetta USB: `E:\`).
* **Browse...:** Pulsante per cercare la cartella.
* **Create Bundle Filename:** Nome del file bundle che verrà creato quando clicchi "Create Bundle" (es. `mio_repo.bundle`).
* **Fetch Bundle Filename:** Nome del file bundle da cui verranno lette le modifiche quando clicchi "Fetch from Bundle" (es. `aggiornamento_repo.bundle`).
* **Prepare Repository:** Pulsante per inizializzare Git nella directory specificata (se non già fatto con `git init`) e assicurarsi che `.svn` sia nel `.gitignore`. Abilitato solo se l'indicatore è rosso.
* **Create Bundle:** Pulsante per creare il file bundle specificato in `Create Bundle Filename` nella `Bundle Target Directory`. Potrebbe eseguire backup e/o autocommit prima, se abilitati. Abilitato solo se l'indicatore è verde.
* **Fetch from Bundle:** Pulsante per leggere il file bundle specificato in `Fetch Bundle Filename` dalla `Bundle Target Directory`, importare le modifiche nel repository locale e tentare un merge. Potrebbe eseguire un backup prima, se abilitato. Abilitato solo se l'indicatore è verde.
* **Edit .gitignore:** Pulsante per aprire una finestra separata dove puoi modificare il file `.gitignore` del repository locale. Abilitato se il percorso del repository è valido.
#### Scheda: Backup Settings
Configura le opzioni di backup automatico e manuale.
* **Enable Auto Backup...:** Spunta questa casella per creare automaticamente un backup ZIP del repository prima delle operazioni "Create Bundle" e "Fetch from Bundle".
* **Backup Directory:** Percorso della directory dove verranno salvati i backup ZIP. Abilitato solo se "Enable Auto Backup" è spuntato.
* **Browse...:** Pulsante per cercare la cartella.
* **Exclude File Extensions:** Elenco separato da virgole di estensioni di file da escludere dal backup (es. `.log,.tmp,.bak`). Case-insensitive.
* **Exclude Directories:** Elenco separato da virgole di nomi di directory da escludere dal backup (es. `__pycache__,.venv,node_modules,build`). Verranno escluse le directory con questi nomi a qualsiasi livello. Case-insensitive. `.git` e `.svn` sono sempre esclusi implicitamente.
* **Create Manual Backup Now (ZIP):** Pulsante per eseguire immediatamente un backup ZIP del repository usando le impostazioni di esclusione correnti. Abilitato solo se il percorso del repository è valido.
#### Scheda: Commit
Gestisce il commit automatico e manuale.
* **Enable Autocommit...:** Spunta questa casella per tentare un commit automatico di tutte le modifiche locali *prima* dell'operazione "Create Bundle". Utilizzerà il messaggio inserito sotto. Abilitato solo se il repository è pronto (indicatore verde).
* **Commit Message:** Area di testo multilinea dove inserire il messaggio di commit. Usato sia per l'autocommit (se abilitato) sia per il commit manuale.
* **Commit All Changes Manually:** Pulsante per eseguire `git add .` seguito da `git commit -m "messaggio"` usando il messaggio inserito sopra. Abilitato solo se il repository è pronto.
#### Scheda: Tags
Visualizza e gestisce i tag Git.
* **Lista Tag:** Mostra i tag esistenti nel repository (nome e messaggio/subject), ordinati dal più recente al più vecchio.
* **Refresh Tags:** Ricarica l'elenco dei tag dal repository.
* **Create New Tag...:** Apre una finestra di dialogo per inserire nome e messaggio per un nuovo tag annotato. Eseguirà un commit prima, se ci sono modifiche e se è fornito un messaggio nella scheda "Commit".
* **Checkout Selected Tag:** Effettua il checkout del tag selezionato nella lista. **Attenzione:** Questo mette il repository in stato "detached HEAD". Utile per ispezionare lo stato del progetto a un certo tag, ma non per fare nuovi commit direttamente.
#### Scheda: Branches
Visualizza e gestisce i branch Git locali.
* **Lista Branch:** Mostra i branch locali. Il branch corrente è indicato da un asterisco (`*`).
* **Refresh Branches:** Ricarica l'elenco dei branch.
* **Create New Branch...:** Apre una finestra di dialogo per inserire il nome di un nuovo branch da creare a partire dalla posizione corrente (HEAD).
* **Checkout Selected Branch:** Effettua il checkout del branch selezionato nella lista, rendendolo il branch attivo.
#### Scheda: History
Visualizza la cronologia dei commit.
* **Filter History by Branch/Tag:** Menù a tendina per visualizzare la cronologia di tutti i branch/tag (`-- All History --`) o solo quella raggiungibile da un branch o tag specifico.
* **Refresh History:** Ricarica la cronologia dei commit in base al filtro selezionato.
* **Area Testo Cronologia:** Mostra i commit formattati (hash abbreviato, data, autore, riferimenti, messaggio). I commit più recenti sono in alto.
### Area Log Applicazione (Inferiore)
Questa area di testo mostra messaggi dettagliati sulle operazioni eseguite dal tool, l'output dei comandi Git, avvisi ed errori. È fondamentale controllarla per capire cosa sta succedendo e per diagnosticare eventuali problemi.
## 6. Funzionalità Dettagliate e Flussi di Lavoro
### Gestione dei Profili
1. **Aggiungere:** Clicca "Add New", inserisci un nome univoco, clicca OK. Il nuovo profilo verrà selezionato.
2. **Configurare:** Compila i percorsi e le opzioni desiderate nelle varie schede.
3. **Salvare:** Clicca "Save Profile" per memorizzare le impostazioni.
4. **Selezionare:** Usa il dropdown "Select Profile" per passare da una configurazione all'altra.
5. **Rimuovere:** Seleziona il profilo da eliminare (non `default`) e clicca "Remove". Conferma l'operazione.
### Workflow Principale: Sincronizzazione Online/Offline
Questo è lo scenario d'uso primario del tool. Assumiamo:
* **Macchina ORIGINE:** PC con il repository Git principale.
* **Macchina DESTINAZIONE:** PC offline dove vuoi lavorare.
* **Supporto Esterno:** Chiavetta USB (o simile) per trasferire i file bundle.
#### Fase 1: Configurazione Iniziale dei Profili
* **Su Entrambe le Macchine:** Avvia il tool.
* **Crea/Seleziona Profilo:** Crea un profilo con lo stesso nome su entrambe le macchine (es. "MioProgettoOffline").
* **Configura (ORIGINE):**
* `SVN Working Copy Path`: Percorso repo Git su ORIGINE.
* `Bundle Target Directory`: Lettera/Percorso della chiavetta USB.
* `Create Bundle Filename`: Nome bundle da ORIGINE a DESTINAZIONE (es. `MioProgetto_O2D.bundle`).
* `Fetch Bundle Filename`: Nome bundle da DESTINAZIONE a ORIGINE (es. `MioProgetto_D2O.bundle`).
* Configura Backup/Commit a piacere.
* Clicca **Save Profile**.
* **Configura (DESTINAZIONE):**
* `SVN Working Copy Path`: Percorso della cartella (inizialmente vuota) su DESTINAZIONE dove andrà il repo.
* `Bundle Target Directory`: Lettera/Percorso della chiavetta USB.
* `Create Bundle Filename`: **Deve corrispondere** al `Fetch Bundle Filename` dell'ORIGINE (es. `MioProgetto_D2O.bundle`).
* `Fetch Bundle Filename`: **Deve corrispondere** al `Create Bundle Filename` dell'ORIGINE (es. `MioProgetto_O2D.bundle`).
* Configura Backup/Commit a piacere.
* Clicca **Save Profile**.
#### Fase 2: Creare il Bundle Iniziale (Macchina ORIGINE)
1. Assicurati che tutte le modifiche nel repository su ORIGINE siano committate.
2. Inserisci la chiavetta USB.
3. Avvia il tool, seleziona il profilo "MioProgettoOffline".
4. Vai alla scheda "Repository / Bundle".
5. Se l'indicatore di stato è rosso, clicca "Prepare Repository".
6. Clicca **"Create Bundle"**. Verrà creato il file `MioProgetto_O2D.bundle` sulla USB. Controlla il log.
#### Fase 3: Clonare dal Bundle (Macchina DESTINAZIONE)
1. Sposta la chiavetta USB sulla Macchina DESTINAZIONE.
2. Crea la cartella vuota specificata nel profilo (se non esiste già).
3. Avvia il tool, seleziona il profilo "MioProgettoOffline".
4. Vai alla scheda "Repository / Bundle".
5. Clicca "Prepare Repository" (inizializza la cartella vuota come repo Git).
6. Clicca **"Fetch from Bundle"**. Il tool leggerà `MioProgetto_O2D.bundle` dalla USB e popolerà il repository locale. Controlla il log.
7. Ora hai una copia funzionante del repository sulla Macchina DESTINAZIONE.
#### Fase 4: Lavorare Offline (Macchina DESTINAZIONE)
1. Modifica i file del progetto nella directory del repository su DESTINAZIONE.
2. Fai commit delle tue modifiche:
* Usa la scheda "Commit" del tool (inserisci messaggio, clicca "Commit All Changes Manually").
* Oppure usa i comandi `git add` e `git commit` da terminale nella directory del repository.
#### Fase 5: Creare Bundle di Aggiornamento (Macchina DESTINAZIONE)
1. Inserisci la chiavetta USB.
2. Avvia il tool, seleziona il profilo "MioProgettoOffline".
3. Vai alla scheda "Repository / Bundle".
4. Clicca **"Create Bundle"**. Verrà creato il file `MioProgetto_D2O.bundle` sulla USB, contenente le modifiche fatte offline. Controlla il log.
#### Fase 6: Importare Aggiornamenti (Macchina ORIGINE)
1. Sposta la chiavetta USB sulla Macchina ORIGINE.
2. Avvia il tool, seleziona il profilo "MioProgettoOffline".
3. Vai alla scheda "Repository / Bundle".
4. Clicca **"Fetch from Bundle"**. Il tool leggerà `MioProgetto_D2O.bundle` dalla USB, importerà i commit e tenterà di fare il merge nel branch corrente del repository su ORIGINE. Controlla il log per successo o eventuali conflitti.
5. Se ci sono conflitti, risolvili manualmente usando strumenti Git standard e fai commit della risoluzione.
#### Fase 7: Continuare il Ciclo
Ripeti i passaggi da Fase 4 a Fase 6 per continuare a sincronizzare le modifiche tra le due macchine. Puoi anche invertire il flusso se fai modifiche sull'ORIGINE che vuoi portare sulla DESTINAZIONE (creando il bundle `_O2D` e facendo fetch sulla DESTINAZIONE).
### Backup Manuale
1. Seleziona il profilo desiderato.
2. Vai alla scheda "Backup Settings".
3. Assicurati che le opzioni "Exclude..." siano configurate come vuoi.
4. Assicurati che il percorso in "Backup Directory" sia valido (anche se "Enable Auto Backup" non è spuntato, il percorso viene usato per il backup manuale).
5. Clicca **"Create Manual Backup Now (ZIP)"**. Verrà creato un file ZIP con timestamp nella directory di backup specificata.
### Commit Manuale
1. Seleziona il profilo del repository su cui vuoi fare commit.
2. Vai alla scheda "Commit".
3. Scrivi un messaggio di commit significativo nell'area di testo.
4. Clicca **"Commit All Changes Manually"**.
### Gestione Tag e Branch
* **Visualizzare:** Vai alle schede "Tags" o "Branches" e clicca "Refresh..." per caricare l'elenco aggiornato.
* **Creare:** Clicca "Create New Tag..." o "Create New Branch...", inserisci il nome (e messaggio per i tag) nella finestra di dialogo.
* **Checkout:** Seleziona un tag o branch dalla lista e clicca "Checkout Selected Tag" o "Checkout Selected Branch". Ricorda le implicazioni (Detached HEAD per i tag).
### Modifica di `.gitignore`
1. Seleziona il profilo del repository desiderato.
2. Vai alla scheda "Repository / Bundle".
3. Clicca **"Edit .gitignore"**. Si aprirà una finestra di editor.
4. Modifica il file come necessario.
5. Clicca "Save and Close" per salvare le modifiche o "Cancel" per annullare.
## 7. File di Configurazione (`git_svn_sync.ini`)
Le impostazioni dei profili vengono salvate in un file chiamato `git_svn_sync.ini` nella stessa directory dello script. Il formato è standard INI.
**Si sconsiglia di modificare manualmente questo file**, a meno che non si sappia esattamente cosa si sta facendo. Il tool gestisce la creazione, la lettura e la scrittura di questo file in modo sicuro.
## 8. Logging
Il tool produce log dettagliati per aiutarti a capire le operazioni e diagnosticare problemi:
* **Area Log GUI:** Mostra i log in tempo reale nella parte inferiore della finestra principale. Utile per un feedback immediato.
* **File di Log:** Un file chiamato `git_svn_sync.log` viene creato (o aggiunto) nella directory dello script. Contiene una cronologia più persistente delle operazioni, utile per analisi post-mortem.
I livelli di log (INFO, DEBUG, WARNING, ERROR, CRITICAL) aiutano a distinguere la gravità dei messaggi.
## 9. Risoluzione Problemi Comuni
* **Errore "git command not found" o simile:** Git non è installato correttamente o non è nel PATH di sistema. Verifica l'installazione di Git.
* **Errore "Permission denied":** Lo script non ha i permessi per leggere/scrivere nelle directory specificate (repository, bundle target, backup). Controlla i permessi delle cartelle.
* **Conflitti durante "Fetch from Bundle":** Significa che ci sono state modifiche divergenti sullo stesso branch in entrambi i repository (ORIGINE e DESTINAZIONE) tra le sincronizzazioni. Devi risolvere i conflitti manualmente nel repository dove hai eseguito il fetch, usando i comandi Git standard (`git status`, modifica i file con i marcatori di conflitto `<<<<<`, `>>>>>`, `=====`, poi `git add <file_risolti>`, `git commit`).
* **Bundle vuoto creato ("refusing to create empty bundle"):** Il repository di origine non aveva commit o riferimenti (branch/tag) da includere nel bundle. Questo è normale per un repository appena inizializzato.
* **Impostazioni non salvate:** Ricorda sempre di cliccare "Save Profile" dopo aver modificato percorsi, nomi file o opzioni in un profilo.
* **L'indicatore di stato non diventa verde:** Assicurati che il percorso in "SVN Working Copy Path" sia corretto e punti a una directory esistente. Se è corretto ma rimane rosso, prova a cliccare "Prepare Repository". Se fallisce, controlla i log per errori specifici.
---