Newsgroup: it.comp.os.linux.iniziare
Titolo: Git - cambio utente e mail - strani errori...

 
Avevo la necessità di un sistema di backup e possibilità
di ripristinare versioni diverse degli stessi in caso di
incasinamenti.
Mi è stato consigliato "git" da Enrico Bianchi in altra
discussione. E allora mi sono letto un attimo di tutorial
e ho provato a fare un po' di pratica.
 
Viene richiesto di specificare un nome utente e un indirizzo
email mio, in modo da marcare poi le modifiche che apporto
con le mie credenziali.
Questo aspetto è cruciale se si lavora in team. Non so quanto
serva nel mio caso visto che sto trafficando da solo alla
preparazione di questa roba, nella fattispecie si tratta di
un documento stile rivista, quindi tanto per dare un'idea
ho a che fare con testo, immagini e impaginazione del tutto.
In teoria non sarebbe mica male poterci lavorare in gruppo
usando git, ma nei fatti il resto del "team" va ancora a carta
penna e scrittura corsiva.
Per questo ho messo delle credenziali a casaccio... Però ho
fatto un errore (che per quanto detto è solo diciamo formale)
che volevo correggere. In pratica avevo settato l'email e
l'utente così:
 
git config 
user.name
 "Joe"
git config user.email "joe@joe@localhost.local"
 
Come vedete c'è un errore e volevo correggere l'email
così:
 
j...@localhost.local
 
Il che dovrebbe essere possibile con questo comando che ho dato:
 
git config user.email "j...@localhost.local"
 
Ok...
Però se guardo il log:
 
git log
 
mi dice che le vecchie modifiche, quelle precedenti al
cambio di email sono state date da Joe con email quella
vecchia sbagliata...
Volendo aggiustare l'errore anche per i vecchi commit
ho visto che esiste un bella paginetta facile da seguire
che spiega come usare uno script bash molto semplice fatto
apposta per lo scopo e chiamato "filter-branch".
 
https://help.github.com/articles/changing-author-info/
 
 
In pratica:
 
cd /tmp
git clone --bare ~/mioprogetto
 
cd mioprogetto.git
../git-author-rewrite.sh
 
In effetti se ora do "git log" le modifiche hanno come credenziali
l'email giusta corretta.
Ora però bisogna sincronizzare le modifiche apportate a questo repo
temporaneo (/tmp/mioprogetto.git/) sul repo "ufficiale", che in
pratica è la cartella ~/mioprogetto.
Lì dice che il comando da dare è il seguente:
 
git push --force --tags origin 'refs/heads/*'
 
Però ottengo dei messaggi d'errore:
-----------------------------------
joe@localhost:/tmp/mioprogetto.git$ git push --force --tags origin 'refs/heads/*'
Counting objects: 68, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (66/66), done.
Writing objects: 100% (68/68), 50.48 MiB | 8.66 MiB/s, done.
Total 68 (delta 1), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: is denied, because it will make the index and work tree inconsistent
remote: with what you pushed, and will require 'git reset --hard' to match
remote: the work tree to HEAD.
remote:
remote: You can set the 'receive.denyCurrentBranch' configuration variable
remote: to 'ignore' or 'warn' in the remote repository to allow pushing into
remote: its current branch; however, this is not recommended unless you
remote: arranged to update its work tree to match what you pushed in some
remote: other way.
remote:
remote: To squelch this message and still keep the default behaviour, set
remote: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To /home/joe/mioprogetto
 ! [remote rejected] master -> master (branch is currently checked out)
 error: failed to push some refs to '/home/joe/mioprogetto'
-----------------------------------------------------------
 
Domanda, da cosa dipendono questi errori?
Mi date una mano ad interpretarli?
 
Andando nella dir del repo ufficiale ~/mioprogetto e lanciando
"git log", i vecchi commit sono stati effettivamente "corretti",
riportano la nuova email giusta.
 
Cosa ne pensate?
grazie!  :)
 
e lanciando 

 Domanda, da cosa dipendono questi errori?
 
Gli errori dipendono dal fatto che hai fatto un clone di tipo bare, ovvero, se
guardi la struttura della directory, noterai che non hai i file di progetto,
ma quelli della directory .git. Un repository in questo formato ti serve come
"nodo centrale", ovvero un repository a cui mandare i tuoi push e da cui
scaricare via pull le modifiche. Quindi, per "sistemare", devi fare prima un
clone del repository bare, poi quel clone lo mandi via push (o lo scarichi via
pull) dal tuo repository di lavoro. In ogni caso, quello script per sistemare
l'utente e l'email nel log, puoi lanciarlo anche direttamente sul repository
senza fare il giro di bare. Ovvero, per spiegare quest'ultimo punto, puoi fare
cd ~/mioprogetto; sh script-di-correzione-log.sh senza problemi (ovviamente
prima fatti un backup)
 
Enrico

 giro di bare.
 
Che ci vuoi fare, i tutorial più macabri un giro di bare
lo consigliano sempre... (lo so lo so merita il plonk! :D ).

 Cosa mi sfugge?
 
Ti sfugge il passaggio del repository intermedio. Per capirci:
 
git clone --bare repositoryoriginale repositorybare
cd repositorybare
# sistemi con lo script
cd ..
git clone repositorybare repositorytemporaneo
cd repositorytemporaneo
git push --force ../repositoryoriginale
 
Oppure:
git clone repositoryoriginale repositorytemporaneo
cd repositorytemporaneo
# sistemi con lo script
git push --force ../repositoryoriginale
 
Altrimenti:
cd repositoryoriginale
# sistemi con lo script
 
E te ne freghi di tutti questi giri assurdi ;)
 
Enrico