In ambito Enterprise, la coerenza dei metadati di un repository non è solo una questione estetica, ma un requisito di audit e compliance. Un’errata configurazione locale può inquinare la storia del progetto con email non autorizzate o nomi non standard.
Per risolvere massivamente queste discrepanze, ho adottato lo strumento script.ps1.
Si tratta di uno script per windows, in powershell che può essere facilmente adattato per essere utilizzato all’interno di linux.
Il Codice: script.ps1
Di seguito il contenuto integrale dello script PowerShell utilizzato per l’operazione:
# 1. Configurazione nuovi dati
$CORRECT_NAME = "NUOVO_NOME_DA_ASSEGNARE"
$CORRECT_EMAIL = "NUOVA_MAIL_DA_ASSEGNARE"
Write-Host "--- Sincronizzazione con il server (Fetch) ---" -ForegroundColor Cyan
git fetch --all
# Sincronizza tutti i branch remoti come branch locali
git branch -r | ForEach-Object {
$branch = $_.Trim() -replace "origin/", ""
if ($branch -notmatch "HEAD") {
git branch --track $branch $_.Trim() 2>$null
}
}
Write-Host "--- RISCRITTURA TOTALE DI TUTTI I BRANCH ---" -ForegroundColor Cyan
# 2. Riscrittura (Senza controllo IF, sovrascrive tutto)
git filter-branch -f --env-filter "
export GIT_AUTHOR_NAME='$CORRECT_NAME'
export GIT_AUTHOR_EMAIL='$CORRECT_EMAIL'
export GIT_COMMITTER_NAME='$CORRECT_NAME'
export GIT_COMMITTER_EMAIL='$CORRECT_EMAIL'
" --tag-name-filter cat -- --branches --tags
# 3. Pulizia backup
git for-each-ref --format="delete %(refname)" refs/original | git update-ref --stdin
# 4. Verifica e Push
Write-Host "`n--- VERIFICA DEGLI ULTIMI 5 COMMIT ---" -ForegroundColor Green
git log -n 5 --format="%h %an <%ae> %s"
Write-Host "`nI dati sopra sono corretti? (S/N)" -ForegroundColor Magenta
$conferma = Read-Host
if ($conferma -eq "S" -or $conferma -eq "s") {
Write-Host "Pushing all branches and tags..." -ForegroundColor Cyan
git push --force --all
git push --force --tags
Write-Host "FINITO!" -ForegroundColor Green
}
#!/bin/bash
# 1. Configurazione nuovi dati
CORRECT_NAME="NUOVO_NOME_DA_ASSEGNARE"
CORRECT_EMAIL="NUOVA_MAIL_DA_ASSEGNARE"
echo -e "\e[36m--- Sincronizzazione con il server (Fetch) ---\e[0m"
git fetch --all
# Sincronizza tutti i branch remoti come branch locali
for remote in $(git branch -r | grep -v '\->'); do
branch=${remote#origin/}
git branch --track "$branch" "$remote" 2>/dev/null
done
echo -e "\e[36m--- RISCRITTURA TOTALE DI TUTTI I BRANCH ---\e[0m"
# 2. Riscrittura (Senza controllo IF, sovrascrive tutto)
git filter-branch -f --env-filter "
export GIT_AUTHOR_NAME='$CORRECT_NAME'
export GIT_AUTHOR_EMAIL='$CORRECT_EMAIL'
export GIT_COMMITTER_NAME='$CORRECT_NAME'
export GIT_COMMITTER_EMAIL='$CORRECT_EMAIL'
" --tag-name-filter cat -- --branches --tags
# 3. Pulizia backup
git for-each-ref --format="delete %(refname)" refs/original | git update-ref --stdin
# 4. Verifica
echo -e "\n\e[32m--- VERIFICA DEGLI ULTIMI 5 COMMIT ---\e[0m"
git log -n 5 --format="%h %an <%ae> %s"
echo -e "\n\e[35mI dati sopra sono corretti? (S/N)\e[0m"
read -r conferma
if [[ "$conferma" =~ ^[Ss]$ ]]; then
echo -e "\e[36mPushing all branches and tags...\e[0m"
git push --force --all
git push --force --tags
echo -e "\e[32mFINITO!\e[0m"
fiAnalisi Funzionale dello Script
script.ps1 opera attraverso quattro fasi critiche, ognuna progettata per garantire che la modifica sia globale e permanente:
1. Sincronizzazione Totale dell’Albero (Fetch & Track)
A differenza di un comando standard che agisce solo sul branch corrente, lo script identifica tutti i branch remoti presenti sul server (origin/) e crea una traccia locale corrispondente. Questo assicura che la riscrittura non tralasci rami secondari o legacy.
2. Riscrittura Incondizionata dei Metadati
Il cuore del processo utilizza git filter-branch con un --env-filter. In questa fase, lo script esporta forzatamente le nuove variabili d’ambiente:
- Identità Autore: Colui che ha scritto originariamente il codice.
- Identità Committer: Colui che ha applicato il commit nel repository.L’uso del flag
-f(force) permette di sovrascrivere eventuali tentativi di riscrittura precedenti.
3. Manutenzione del Database Git
Git conserva solitamente un backup dei riferimenti originali in refs/original per permettere un rollback. script.ps1 provvede alla pulizia automatica di questi backup tramite git update-ref, riducendo le dimensioni del repository e finalizzando le modifiche a livello locale.
4. Validazione e Push Forzato
L’ultima fase funge da “failsafe”. Lo script mostra un output degli ultimi 5 commit per verificare la correttezza dell’email e del nome. Solo dopo l’input positivo dell’operatore, viene eseguito il push forzato (--force) che aggiorna sia tutti i branch che tutti i tag sul server remoto.
L’utilizzo di script.ps1 trasforma un’operazione complessa e potenzialmente rischiosa in una procedura standardizzata. È lo strumento ideale per migrazioni di repository o per l’allineamento di profili developer post-configurazione.
Ovviamente il consiglio è quello di impostare il livello multi-identità utlizzando la configurazione che abbiamo trattato nel post precedente.