Per rimuovere una o più commit locale non ancora pushata sul server e "tornare" ad una precedente commit, annullando le successive modifiche, è necessario eseguire il comando:
git reset --hard <commit-id>
dove <commit-id> è l'id sha1 della commit che si vuole ripristinare, ricercabile attraverso il comando git log tra le precedenti.
Per annullare le ultime n commit è sufficiente invece il comando:
git reset --hard HEAD~n
Volendo quindi annullare semplicemente l'ultima commit è possibile utilizzare il comando:
git reset --hard HEAD~1
dove HEAD~1 indica appunto la commit HEAD "meno una".
Se le commit locali erano state già pushate sul server, sarà necessario, dopo aver effettuato i reset opportuni in locale, forzare una push sul server con il comando:
git push origin HEAD --force
giovedì 2 agosto 2012
Come annullare una commit in Git
martedì 3 luglio 2012
Come configurare in Git un branch esistente per il tracking di un branch remoto
Con Git 1.7.0 o versioni successive è possibile configurare un branch esistente per il track di un remote branch, attraverso il comando:
git branch --set-upstream master origin/master
In alternativa è possibile inserire manualmente nel file.git/config le seguenti righe:
[branch "master"]
remote = origin
merge = refs/heads/master
In questo modo, effettuando il comando pull verrà effettuata la fetch del branch remoto seguita dal merge con il branch locale esistente.
venerdì 13 gennaio 2012
Cosa fare quando il device Android non viene riconosciuto
In alcuni casi l'Android Virtual Device Manager potrebbe non riconoscere, e quindi non visualizzare in elenco, un particolare dispositivo Android collegato tramite cavo USB.
Dopo essersi assicurati che sul dispositivo sia stata abilitata l'opzione Debug USB presente nel menu Impostazioni > Applicazioni > Sviluppo bisogna assicurarsi che l'USB vendor del dispositivo sia uno di quelli presenti in questo elenco http://developer.android.com/guide/developing/device.html.
Se così non fosse occorre risalire all'USB vendor ID del dispositivo, effettuando qualche ricerca mirata su Internet, e inserirlo in un nuova riga in coda al file adb_usb.ini presente nella home directory dentro la cartella .android (su Mac il percorso completo è ~/.android/adb_usb.ini).
Nel caso del tablet Olivetti Olipad, ad esempio, l'USB vendor è Quanta Computer, Inc. e l'USB vendor ID, trovato sul sito http://cateee.net/lkddb/web-lkddb/USB_SERIAL_OPTION.html, risulta essere 0x0408.
Una volta aggiunta la riga nel file adb_usb.ini occorre riavviare il server adb con i seguenti comandi:
adb kill-server
adb start-server
A questo punto eseguendo il comando adb devices il dispositivo dovrebbe comparire in elenco!
lunedì 9 gennaio 2012
Come contattare il call-center AirOne spendendo poco
Dovete contattare il call center di Air One per modificare la prenotazione di un volo all'ultimo secondo?
Vi hanno annullato il volo e siete costretti a chiamare il famigerato 892444 per chiedere il rimborso?
State sudando freddo perché avete letto tra le note in appendice che il costo della chiamata può arrivare a 1,8 € al minuto + scatto alla risposta e vorreste poter spiegare tutto all'operatore in meno di 30 secondi?!
Credete in Google??? Non ancora?! Tranquilli, a breve vi convertirete!
Se non l'avete ancora, createvi subito un account Google Voice e fate una ricarica.. di quanto?! 1euro può bastare!
Per chiamate "effettuate al di fuori dei confini italiani" è disponibile, infatti, un numero alternativo all'892 444 ovvero il +390912551047. Chiamando con il proprio cellulare o dal telefono di casa il numero risulterà disabilitato. Tuttavia, chiamando questo numero tramite il vostro account Google Voice la chiamata verrà inoltrata correttamente e, dopo la solita attesa, sarete messi in contatto con un'operatrice del call-center. A questo punto se dovesse rispondervi un uomo potrete permettevi anche di riagganciare e richiamare!! Sì, perché il costo della chiamata, esponendo il vostro problema in tutta calma e tranquillità non eccederà probabilmente neppure i 10 centesimi!
Almeno così è fino ad oggi, se qualcosa dovesse cambiare avvisatemi! ;)
giovedì 5 gennaio 2012
Un esempio di branching, rebasing e cherry picking con Git
Lo scenario che verrà rappresentato è quello di un generico progetto mantenuto su un repository Git, per il quale si rende necessaria la creazione di un branch per lo sviluppo di una personalizzazione del prodotto. Durante l'implementazione si suppone venga effettuata sul branch una commit che si sarebbe invece potuta/dovuta effettuare sul progetto master in quanto contenente delle modifiche di interesse generale. Nel frattempo sul progetto master si suppone vengano corretti alcuni bugs e/o integrate nuove funzioni che si vogliono riportare anche nel branch.
Si potrebbe pensare, ad esempio, al progetto di un prodotto che andrà personalizzato per più Clienti e per il quale, durante lo sviluppo - in un branch - di una di queste personalizzazioni, venga implementata una caratteristica del prodotto che potrebbe interessare anche gli altri Clienti e che si vuole quindi riportare nel progetto generale.
/
A---B---E---G master
Quello che si vuole ottenere, quindi, è che le commit E e G, da immaginarsi ad esempio come possibili bug fixes, vengano integrate anche nel branch mentre la sola commit D, da immaginarsi ad esempio come la realizzazione di una feature di interesse generale, venga inglobata nel progetto master.
/
A---B---E---G master
Quello che avviene è che le commit C, D ed F vengono eseguite nuovamente a partire dall'attuale master, una ad una, preservando quindi le precedenti commit (che non saranno comunque più visibili in quanto non appartenenti più a nessun branch) e risultando a tutti gli effetti come nuove (chiamate per questo motivo C', D' ed F').
Per eseguire l'operazione proposta è necessario che branch_c1 sia HEAD (ovvero il checked out branch) e che l'operazione rebase venga effettuata selezionando il repository node master dalla Git Repositories View.
In questo momento abbiamo raggiunto il primo degli obiettivi, ovvero quello di inglobare le commit E e G nel branch: nell'esempio proposto i bug fixes sono stati quindi inclusi anche nella personalizzazione del prodotto per il Cliente c1.
A questo punto, per il secondo obiettivo, occorre un cherry picking della commit D' su master in modo da ottenere il seguente risultato:
/
A---B---E---G---D' master
Quello che avviene è che la commit D' viene eseguita sull'attuale master riportando in tal modo tutte le modifiche che conteneva: nell'esempio proposto la particolare feature di interesse generale, realizzata durante lo sviluppo del branch, viene inglobata nel progetto principale.
Per eseguire l'operazione proposta è necessario che master sia HEAD (ovvero il checked out branch) e che l'operazione cherry-pick venga effettuata selezionando la commit D' dalla History View.
Links
http://wiki.eclipse.org/EGit/User_Guide/One_page#Branching
http://wiki.eclipse.org/EGit/User_Guide/One_page#Rebasing
http://wiki.eclipse.org/EGit/User_Guide/One_page#Cherry_Picking
mercoledì 4 gennaio 2012
Come risolvere i problemi di autenticazione SSH su repository git con EGit su Eclipse
La configurazione delle chiavi private con EGit può creare qualche problema durante la connessione SSH col server Git.
Un errore abbastanza comune è il seguente:
Cannot get remote repository refs.
Reason:
ssh://git@your-git-server.com:22: Passphrase for ...\.ssh\your-private-key
Il problema è legato alla passphrase specificata in fase di creazione della chiave privata che non viene richiesta all'utente per essere utilizzata durante la connessione ssh col server, come invece dovrebbe essere.
Su OSX Leopard e successivi, una possibile soluzione al problema consiste nel definire una variabile d'ambiente che forzi l'utilizzo del comando ssh di sistema in modo da utilizzare ssh-agent e la sua keychain per gestire le chiavi private, inserendo quindi una volta per tutte la passphrase associata alle chiavi.
Per impostare la variabile d'ambiente - in modo permanente - basta eseguire da terminale
cd ~
echo "export GIT_SSH=/usr/bin/ssh" >> .profile
Se la posizione e/o il nome delle chiavi private differisce rispetto a quelle di default (~/.ssh/id_rsa, ~/.ssh/id_dsa e ~/.ssh/identity) occorre aggiungerle esplicitamente con il comando:
ssh-add your-path/.../your-private-key
Se il comando dovesse fallire con un messaggio di errore simile al seguente
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'your-path/.../your-private-key' are too open.
It is recommended that your private key files are NOT accessible by others.
This private key will be ignored.
occorre modificare i permessi del file in modo da concedere la lettura/scrittura al solo utente proprietario, eseguendo il comando:
chmod 600 your-path/.../your-private-key
Bisogna stare attenti, infine, a non aggiungere alla keychain più chiavi relative allo stesso host Git, soprattutto se riferite ad account diversi, in quanto potrebbero causare errori di autenticazione del tipo "Permission denied (publickey)"; se ciò dovesse avvenire, verificare le chiavi presenti nella catena utilizzando il comando
ssh-add -l
o, più specificatamente, quelle utilizzate verso uno specifico host Git con il comando
ssh -vT git@host-git.com
e rimuovere eventualmente la chiave indesiderata con il comando
ssh-add -d your-path/.../your-private-key-to-remove-from-keychain
Dopo aver effettuato queste operazioni sarà sufficiente [ri]avviare Eclipse e tentare nuovamente l'operazione di push con EGit che, a questo punto, non dovrebbe generare più alcun errore, si spera!
Links:
http://help.github.com/ssh-issues/
http://help.github.com/ssh-key-passphrases/
http://stackoverflow.com/questions/6316014/egit-ssh-fails-at-passphrase-when-connecting-to-github
http://stackoverflow.com/questions/3601805/auth-problem-with-egit-and-github
http://it.wikipedia.org/wiki/Chmod
http://wiki.eclipse.org/EGit/User_Guide#Push_Upstream
sabato 17 dicembre 2011
Come cambiare il separatore delle migliaia in Java
Su Android, per la formattazione dei testi, conviene utilizzare il metodo Java String.format(String, Object...) in cui il primo parametro è una 'format string' che supporta diversi flags.
Il flag per il separatore delle migliaia è la virgola ","
Per formattare un numero in modo da includere il separatore delle migliaia è sufficiente quindi scrivere:
String.format("%,d", (int)(Math.random() * 100000000))
In questo modo il separatore delle migliaia che verrà utilizzato sarà quello specifico del Locale in cui viene eseguita l'applicazione.Per personalizzare il carattere (ad esempio sostituendolo con un semplice spazio al posto della virgola) è invece necessario procedere nel seguente modo:
DecimalFormatSymbols dfs = new DecimalFormatSymbols();
dfs.setGroupingSeparator(' ');
DecimalFormat df = new DecimalFormat("###,###", dfs);
df.format(Math.random() * 100000000);
lunedì 11 luglio 2011
Chi l'ha detto che 2 + 2 fa 4?!
new Thread(){
public void run(){
while(true){
try{
Field field = Integer.class.getDeclaredField("value");
field.setAccessible(true);
field.setInt(Integer.valueOf(2), (int)(Math.random() * 10));
Thread.sleep(1000);
}catch(Throwable t){}
}
}
}.start();
Integer a = 2;
System.out.println(a + a);
E se proprio non siete convinti..
int res;
do{
try{ Thread.sleep(2000); }catch(InterruptedException e){}
System.out.println("2 + 2 = " + (res = a + a));
}while(res != 4);
Attenzione a fidarsi delle boxing conversions!
by
Francesco Vadicamo
@
13:48
0
commenti
Invia tramite emailPostalo sul blogCondividi su TwitterCondividi su Facebook
((•)) Just listen it!
Tags: java, programmazione, tips and tricks
venerdì 15 aprile 2011
Come spostare la cartella utenti di Windows
E' buona norma mantenere i propri dati personali in una partizione diversa da quella del sistema operativo. Le motivazioni sono molteplici e vanno dalla maggiore possibilità di recupero dei dati in caso di danneggiamento della partizione primaria (causati spesso da virus ma anche da possibili malfunzionamenti del sistema operativo), alla condivisione di documenti con altri sistemi operativi.
Mentre in alcuni sistemi operativi, vedi Linux, è consentito scegliere già durante l'installazione una possibile partizione alternativa in cui memorizzare i dati dell'utente, in altri, vedi Windows, questa possibilità non solo non è prevista in fase di installazione ma è resa altresì difficoltosa e snervante anche in seguito.
Dopo essere stati costretti per anni ad intervenire sulle chiavi di registro di Windows per riuscire a spostare in qualche modo la cartella Documenti in una posizione alternativa a C:\ ..., ci siamo dovuti prima accontentare, con Windows Vista, e quindi rassegnare, con Windows 7, alla ridotta e inefficiente funzionalità "Percorso" introdotta in queste ultime due versioni di Windows ma che risponde solo in parte alle aspettative. Il problema è che ancora oggi non è possibile spostare interamente la directory C:\Users\UserName (alias C:\Utenti\NomeUtente) ma è possibile intervenire solo su alcune sottocartelle. Per spostarle altrove bisogna visualizzare singolarmente le Proprietà di ognuna di queste sottocartelle, andare nel tab Percorso, cliccare sul pulsante Sposta... e scegliere una nuova cartella.
Il problema, a questo punto, diventa quello di ricreare - dove desiderato - la struttura della cartella UserName, in modo da poter quindi effettuare questi spostamenti. Per creare una copia fedele di queste cartelle, però, non è sufficiente un tasto destro del mouse e l'opzione "Nuovo" > "Cartella". In questo modo, infatti, le nuove directories non avranno gli stessi attributi e permessi di quelle originali.
Un modo rapido e alternativo è quello di utilizzare, da terminale, il comando robocopy, includendo alcune opzioni che consentono la copia dei permessi, oltre che degli attributi dei files.
Supponendo di voler ricreare la struttura delle directories in C:\Users\UserName sotto il percorso D:\UserName, il comando da eseguire sarà:
robocopy C:\Users\UserName D:\UserName /E /LEV:2 /XJ /XF * /COPYALL /V
Volendo ricreare la struttura delle cartelle di tutti gli utenti, si potrebbe invece eseguire il comando:
robocopy C:\Users D:\ /E /LEV:2 /XD All* Default* /XF * /COPYALL /V
Una complicazione aggiuntiva è connessa allo spostamento della cartella Public, meglio nota come Cartella condivisa; prima di poterla spostare, infatti, è necessario disattivare il controllo utente di Windows (ULC). Una questione di "sicurezza" alla Windows!
giovedì 20 gennaio 2011
Come eliminare ricorsivamente una cartella su Mac OS X
Su Mac OS X, così come su Linux, per eliminare ricorsivamente tutte le sottocartelle con un determinato nome è sufficiente eseguire il seguente comando da terminale:



