Blog Haypo

Aller au contenu | Aller au menu | Aller à la recherche

samedi 12 septembre 2009

git : supprimer un commit, rééditer le dernier changelog

Le gestionnaire de code source git a été lancé en 2005. Depuis sa création, de nombreuses extensions et patchs ont été écrits. Du coup, je tombe régulièrement sur des informations contradictoires lors que je cherche comment faire tel ou tel truc dans Google. Quand j'arrive enfin à faire ce que je veux, je le note pour pas l'oublier :-)

Aujourd'hui, les astuces permettent de modifier les commits précédents. Je m'en suis servi sur un dépôt git-svn pour corriger des soucis avant d'envoyer (git svn dcommit) mes modifications upstream. Attention à ne pas modifier des commits déjà envoyés upstream par contre, sous peine d'avoir de gros conflits.

Supprimer un commit git

Si on réalise après coup qu'un commit est foireux, il peut être utile de le supprimer pour éviter de l'envoyer upstream. Dans mon cas, je devais supprimer un commit et non pas l'annuler (revert) car un script svn en pré-commit me bloquait.

La commande pour supprimer le commit numéro XXX :

git rebase --onto XXX~1 XXX

Rééditer le changelog du dernier commit git

Ça arrive de faire une faute de typo, mais de s'en rendre compte qu'après avoir fait le commit. J'ai toujours voulu pouvoir éditer un changelog à posteriori. C'est possible avec svn (sur le serveur), mais c'est très compliqué. Avec git, on peut facilement éditer un changelog, mais uniquement celui du dernier commit.

La commande pour éditer le changelog du dernier commit :

git commit --amend

Il exite également « git commit -c XXX » et « git commit -C XXX » mais je n'ai pas réussi à m'en servir :-(

mercredi 2 septembre 2009

Réparer un dépôt git après l'échec de git svn dcommit

git-svn est bien pratique pour travailler en local (déconnecté) sur un dépôt Subversion. Le plus gros défaut de cet outil est que lorsque la commande "git svn dcommit" échoue, il laisse le dépôt dans un état assez chaotique. Heureusement l'outil git est conservateur : il est toujours possible de revenir en arrière, sauf que l'opération est très technique et délicate.

Récupérer le numéro de commit

La première étape est de retrouver le numéro du commit qui a échoué en ouvrant le fichier .git/logs/HEAD (j'ai mis des "..." pour votre santé mentale, les logs sont assez illisibles sinon) :

...
eb85fa... e72f83... Victor <haypo@bart> 1251220925 +0000 rebase: access: move calls to network/status from frontend to backend
e72f83... 5112b1... Victor <haypo@bart> 1251220965 +0000 refs/remotes/git-svn: updating HEAD
5112b1... 0f86ea... Victor <haypo@bart> 1251220979 +0000 refs/remotes/git-svn: updating HEAD

Le format du fichier est « uid avant | uid après | nom | timestamp | message ». Disons que c'est la dernière opération (la dernière ligne) qui a merdé. Il faut donc revenir à la version précédente (avant dernière ligne) :

e72f83... 5112b1... (...) 1251220965 (...): updating HEAD

Il faut l'ancien numéro de commit (première colonne donc) : e72f83....

Récupérer ses commits

La commande pour revenir à la version précédente (avant le chao laissé par git svn dcommit) est :

git reset --hard e72f83...

Tada ! Pour comprendre ce qui s'est passé, on peut jetter un oeil à .git/logs/HEAD :

...
eb85fa... e72f83... Victor <haypo@bart> 1251220925 +0000 rebase: access: move calls to network/status from frontend to backend
e72f83... 5112b1... Victor <haypo@bart> 1251220965 +0000 refs/remotes/git-svn: updating HEAD
5112b1... 0f86ea... Victor <haypo@bart> 1251220979 +0000 refs/remotes/git-svn: updating HEAD
0f86ea... e72f83... Victor <haypo@bart> 1251221469 +0200 e73f83...: updating HEAD

Articles similaires

Autres articles (en anglais) qui décrivent cette « astuce » :

apt-get install ...

Voici une liste mise à jour des paquets que j'installe sur une Debian vierge. Lire aussi ma liste de l'année dernière. Cette liste vise à obtenir une machine de développement sous KDE4 avant quelques outils réseaux et multimédias.

Administration du système

  • sudo : passer temporaire root pour exécuter une commande
  • screen : terminal qu'on peut détacher / rattacher pour pouvoir conserver des programmes quand on ferme le terminal (typiquement le client IRC irssi)

Environnement de bureau KDE

  • KDE minimal :
    • kde-minimal
    • kde-standard
    • kde-l10n-fr : Traduction française
  • Courrier et RSS :
    • kaddressbook : Carnet d'adresse
    • akregator : chouette client RSS
    • kmail : mon client mail favori
  • kdeplasma-addons : Plasmoïdes KDE4
  • Groupes d'applications KDE :
    • kdegraphics : Appliactions graphiques
    • kdegames : Jeux
    • kdemultimedia : Applications multimédia
    • kdetoys : Gadgets
    • kdenetwork : Outils réseaux
    • kdeutils : Utilitaires
    • kdeedu : Applications éducatives
    • kdeadmin : Outils d'administration
    • kdeartwork : thèmes et styles

Applications graphiques

  • iceweasel iceweasel-l10n-fr : Firefox et sa traduction française
  • flashplugin-nonfree : Plugin officiel Flash

Développement

  • Compilation :
    • gcc : Compilateur C
    • autoconf automake libtool : autotools
    • make
    • cmake
  • Édition de code :
    • exuberant-ctags : ctags, indexeur de code source permettant de retrouver un symbole (variable / fonction) dans un projet
    • manpages-dev manpages-fr : Pages de manuel
    • vim-gtk : Éditeur vim dans sa version Gtk
  • Gestionnaire de source :
    • git-core
    • git-svn
    • mercurial
    • subversion
  • Débogage :
    • gdb : Débogueur C / C++
    • strace : Tracer les appels systèmes
    • ltrace : Tracer les appels aux bibliothèques
    • lsof : Lister les fichiers ouverts
  • valgrind : Recherche les fuites mémoires et accès invalides à la mémoire
  • diffstat : Statistiques sur un patch (différences)
  • Analyseur statique/dynamique de code Python :
    • pychecker
    • pyflakes
    • pylint

Multimédia

  • gimp : Manipulation de photo
  • gqview : Affichage rapide de photos
  • mplayer : Lecteur audio/vidéo
  • vlc : Lecteur audio/vidéo

Réseau

  • nmap : Scanneur de ports
  • tcpdump : Sniffeur réseau (dumpe le trafic)
  • wireshark : Parseur de paquets et sniffeur réseau
  • netcat netcat6 : client et serveur TCP et UDP générique permettant de s'envoyer du texte ou des fichiers

SSH

  • openssh-server : Serveur SSH
  • sshfs : Monter un dossier distant via SSH (utilise FUSE)
  • keychain : Mémoriser la passphrase SSH (Gnome ne semble pas avoir besoin de keychain, il intègre son propre outil)
  • ssh-askpass : Saisie de la passphrase SSH

Compilation de paquets Debian

  • dpkg-dev : outils de base pour compiler un paquet
  • fakeroot : Permet de compiler un paquet sans être root

La commande "apt-get build-dep paquet" permet d'installer toutes les dépendences pour compiler le paquet spécifié.

mardi 1 septembre 2009

Fuseau horaire français, heure d'été et heure d'hiver

Alors que j'essayais d'implémenter une nouvelle fonction Python liée à la gestion du temps, j'ai buté sur un bug. Le but était de supporter les dates avant 1970 (epoch négatif). Le résultat pour les dates entre 1946 et 1969 étaient corrects, par contre pour les dates antérieures il y avait un « trou » incompréhensible de quelques heures.

Fuseaux horaires

En me documentant sur les fuseaux horaires, j'ai appris que la France est passée d'UTC+0 à UTC+2 en 1940, suite à l'invasion allemande. Ah ! C'était donc ça.

La France est le pays du monde qui couvre le plus de fuseaux horaire (12) :

  1. UTC-10 : Polynésie française (Îles de la Société, Archipel des Tuamotu, Archipel des Tubuai)
  2. UTC-9:30 : Polynésie française (Îles Marquises)
  3. UTC-9 : Polynésie française (Îles Gambier)
  4. UTC-8 : Clipperton
  5. UTC-4 : Guadeloupe, Martinique
  6. UTC-3 : Guyane française, Saint-Pierre-et-Miquelon
  7. UTC+1 : France métropolitaine
  8. UTC+3 : Îles éparses de l'océan Indien, Mayotte
  9. UTC+4 : Îles Crozet, La Réunion
  10. UTC+5 : Îles Kerguelen, Îles Saint-Paul et Amsterdam
  11. UTC+11 : Nouvelle-Calédonie
  12. UTC+12 : Wallis-et-Futuna

Heure d'été, heure d'hiver

Déjà, les fuseaux horaires, c'est compliqué. Mais il y a pire : l'heure d'été et l'heure d'hiver ! En juin 1916, la France adopte l'heure d'été et l'heure d'hiver, suite à la proposition du député André Honnorat. À la fin de la 2e guerre mondiale, l'heure d'été est abandonné en 1946 (ouf !), avec une certaine confusion entre zone libre et occupée.

Mais en 1975, l'heure d'été et l'heure d'hiver (UTC+1 et UTC+2) font leur grand retour suite au choc pétrolier de 1974. Depuis 2002, les dates des changements sont fixées par l'Union Européenne.

Selon une étude de la Commission européenne de 2007, « les économies effectivement réalisées sont difficiles à déterminer, et, en tout cas, "relativement limitées" »... Je vois pas pourquoi on s'emmerde à conserver cet héritage idiot qui sert juste à perturber tout le monde (y compris les vaches qui font du mauvais lait pour se venger).

tzdata

Au niveau informatique, sous Linux c'est tzdata qui est utilisé : paquet qui contient les informations sur les fuseaux horaires, heure d'été/d'hiver et les secondes intercalaires. C'est une archive qui est maintenue par Arthur David Olson et disponible sur le serveur FTP du ''National Institutes of Health''. L'archive compressée du 17 août 2009, tzdata2009l.tar.gz, pèse 176 Ko, taille qui montre bien la complexité de la gestion du temps...

Remarques

  • Le changement d'heure estival a été introduit dans l'ensemble des pays de l'Union européenne au début des années 1980.
  • En traversant la frontière depuis l'Afghanistan pour aller en Chine, on passe d'un fuseau horaire UTC+4:30 à un fuseau UTC+8.
  • Un fuseau horaire n'est pas forcément un nombre entier d'heures. Il existe par exemple les fuseaux UTC-9:30 et UTC+12:45

Sources : le calendrier du changement d'heure d'été, heure d'hiver, service public français, heure d'été (Wikipédia)

Je trouve surtout que c'est un grand bordel et qu'il serait plus simple qu'on utilise tous l'heure UTC. D'ailleurs, la Chine n'a qu'un seul fuseau horaire malgré sa superficie !