lundi 31 janvier 2011

Git pour les nuls - sous Windows, avec interface graphique et en local

Cela fait un bout de temps que je voulais m'installer un système de gestion de versions de code. J'ai toujours eu à faire à des systèmes centralisés et propriétaires (genre Source Safe, Clearcase ou encore Perforce).

Ces outils sont payants, je souhaitais donc passer par un outil en GNU GPL. L'inconvénient, c'est qu'au premier abord, ils fonctionnent tous en ligne de commande, et étant habitué à des outils avec une représentation graphique, je n'étais pas près à m'y investir.

Dernièrement, j'ai vraiment eu le besoin de gérer des versions sur différentes plateformes et la copie de dossier par le réseau, cela va un temps !

Après une petite recherche, git semble être l'outil le plus en vogue en ce moment, et il existe des interfaces graphiques et de très bonnes pages web (que je cite à la fin). Je vais m'attarder sur l'installation sous Windows.

Donc première étape : l'installation

Pour git de base sous Windows, je vous conseille ce dossier et de prendre "le Full Installer".

A l'installation, j'ai coché le fait d'inclure Git et les commandes Linux dans le PATH


Et le fait de garder l'encodage d'origine du fichier.



Les autres options restent en standard.

Ensuite, je vous conseille comme interface graphique Git Extensions. Pour que cela fonctionne, j'ai eu un peu de mal au début (il vous faut .NET de Microsoft d'installer en version 3.5 minimum) et j'avais installé une ancienne version (car une recherche sur Google de Git Extensions retourne en premier l'ancien lieu de stockage de cet outil sur Source Forge).

Normalement, cela doit vous donner ce résultat :



Et dans les Settings / Settings, vous devriez avoir tout en vert :



A partir de là, on peut enfin commencer à mettre notre code en "version control".

Deuxième étape : La création du projet

Contrairement à un Source Safe par exemple, Git ne fonctionne pas avec un serveur centralisé. C'est un gestion de source distribué. C'est à dire que tout le monde stocke sur sa machine l'historique du projet. Il faut savoir tout de même d'un dossier centralisé est nécessaire. Effectivement, il est difficile d'imaginer qu'une personne faisant une modif, que celle-ci se retrouve sur les autres personnes (ou machines).

Dans mon titre, je disais que j'allais travailler en local. Cela signifie avec un disque partagé accessible à diverses machines (donc local dans le sens réseau local). On va donc créer un nouveau projet (repository en language git) qui sera sur un disque partagé.

Pour cela avec Git Extensions, vous avez sur la page d'accueil un "Create new repository". Il suffit de cliquer dessus :



Et là, attention, vous avez deux choix (en plus du lieu de stockage) :
On va ici choisir "Central repository - Not a working dir".
Cette option fait que l'on va créer le projet ou l'on va centralisé les modifications.

Il suffit ensuite de cliquer sur "Initialize".

Le dossier central est maintenant créé (dans l'exemple qui suit, cela sera G:\Share\GitTest). Nous allons le laisser vide pour l'instant, on va maintenant faire la même opération mais pour un dossier de travail. Attention dans ce cas à choisir lors de la création "Personal repository".

A ce moment, le dossier demandé est créé et dedans se trouve un dossier ".git". C'est ce dossier qui contient l'historique du projet (toujours dans la suite de l'exemple, cela sera E:\Dev\GitWorking).

A la fin de cette étape, nous avons donc deux dossiers, un local pour notre base de travail, et un autre qui sera le point central de notre projet qui permettra à toutes les autres machines d'accéder aux dernières versions.

Troisième étape : L'ajout de code dans notre dossier de travail

Imaginons que l'on ajoute maintenant un fichier main.c dans notre dossier de travail (E:\Dev\GitWorking), qu'on le compile et que l'on valide cet exe. On souhaite maintenant mettre ce fichier en source control.
Il suffit alors de lancer Git Extensions, d'ouvrir le repository où l'on travaille (E:\Dev\GitWorking).

Vous devez avoir alors cet écran peu élégant :



La première chose à faire sera de cliquer sur le bouton "Edith .gitignore".
Cela permet de définir les fichiers qui ne doivent pas être pris en compte en source control. On va alors y mettre :

.*
*.o
*.exe

Le premier .* permet d'exclure le .gitignore mais à vous de voir si on ne peut pas en fin de compte le mettre en source control...

A partir de là, j'étais un peu perdu. Il n'y a pas de "Add to source control" ou de "Checkout". Git fonctionne différemment. On considère le dossier du projet comme étant totalement en autorisation de modification. Il faut en fait cliquer sur le bouton "Commit" pour que git analyse les modifications. Il va détecter les nouveaux dossiers / fichiers et les fichiers qui ont été modifiés.

Nous aurons alors dans notre exemple, le cas suivant :



Git trouve bien le fichier main.c, que celui ci est modifié (normal, vu qu'il est nouveau). Les modifications sont indiqués en haut à droite.
A ce moment, on va valider en local que l'on souhaite garder la modification (l'équivalent du checkin mais en local).
Il faut alors sélectionner le fichier, cliquer sur "Stage", mettre un commentaire dans "Commit message" et cliquer sur "Commit" :



Dans mon exemple, j'ai un message d'erreur mais je pense que c'est pour me dire qu'il n'y a pas encore de version initiale, mais cela ne semble pas poser de problème.



Voilà notre première version est labellisée... mais elle n'est accessible qu'en local, il est temps de la mettre dans notre dossier partagé pour que d'autres puissent l'avoir.

Quatrième étape : L'envoi de la version dans le dossier partagé

L'objectif ici est de mettre notre version dans le projet central.
La première étape est de définir le lieu où l'on souhaite mettre notre version (donc renseigner notre projet local E:\Dev\GitWorking que le projet central se trouve dans G:\Share\GitTest).
Pour cela, il faut cliquer sur "Remotes - Manage remote repositories".
Il faut le renseigner ainsi pour travailler en local et cliquer sur Save.



A la question "You have added a new remote repository. Do you want to automatically configure the default push and pull behavior for this remote", répondez "Yes".
Cela signifie que les opérations avec le dossier centralisé se feront toujours avec ce dossier de destination.

Ensuite, il suffit juste de faire un "Commands - Push" pour envoyer notre version dans le dossier central.



A la question concernant la création d'une branche, répondez "Oui". Le dossier central n'ayant pas encore de version, cela va créé le tronc (on verra une autre fois la notion de branche et tronc).

Et voilà, votre version est sur le dossier central.

Cinquième étape : L'accès à partir d'un autre machine

Vous pouvez maintenant accèder à votre version en créant un nouveau dossier de travail sur une autre machine (ou la même éventuellement) en ayant accès au dossier partagé (le G:\Share\GitTest est accessible chez moi en écriture/lecture pour tous).

Pour cela, lancer Git Extensions et cliquer sur "Clone a repository" sur la page d'accueil.


A la fin de cette opération, je peux aller voir sur ma nouvelle machine (dans ce screenshot, cela sera dans F:\GitTest), je vais retrouver mon fichier main.c et le dossier .git.

Imaginons maintenant que sur cette nouvelle machine, je modifie ce fichier main.c.
Il suffit que je refasse l'opération "Commit" pour afficher les modifications, le "Stage" pour sélectionner les modifications à garder, mettre un "Commit message", et cliquer sur "Commit" (voir Etape 3) et de faire le "Push" (voir Etape 4).

Sixième étape : Récupérer les dernières modifications

Pour résumer, sur la machine 1, j'ai ajouté le fichier, j'ai mis la modification dans le dossier central, sur la machine 2, j'ai créé un nouveau dossier en reprenant les modifications courantes, j'ai aussi modifié le fichier et remis dans le dossier central. Maintenant, comment sur la machine 1, dans mon dossier de travail je peux obtenir la dernière version : la réponse est simple : le pull.

Avant le pull :



Le pull :



Après le pull :



Et voilà, j'ai obtenu ma dernière version !
Bien sur, impossible de faire un Push sans avoir fait un Pull avant (ou tout du moins d'avoir la dernière version).

Pour faire une analogie grossière par rapport à un Clearcase ou Source Safe, je dirait que le "Commit" est un "checkin" local d'une version, le Push est le "checkin" sur le server, et le Pull est le "Get latest version".

Voici les deux sites que j'ai utilisé pour commencer avec git :
http://www.siteduzero.com/tutoriel-3-254198-gerez-vos-codes-source-avec-git.html

Et

http://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide

vendredi 28 janvier 2011

Monter un dossier partager Windows en ligne de commande sous MacOSX

Il est assez facile d'accéder à un dossier partagé Windows avec le Finder de MacOSX, mais il est peut être pratique de connaitre la manip en ligne de commande (dans le cas ou l'on veut monter un dossier particulier).

D'abord, il faut créer le dossier de destination dans /Volumes/MonDossier

Et après, il faut exécuter la ligne de commande suivante :

mount -t smbfs "//utilisateur@serveur/DossierPartage" MonDossier

Suite à cette opération, il est possible qu'un mot de passe soit demandé.

Mise à jour pour Lion :
ATTENTION à bien mettre les guillemets, avec Lion, il semble qu'une nouvelle version de mount_smbfs soit utilisé et elle impose ces guillemets sous peine d'un message "no such file or directory"...

mercredi 26 janvier 2011

Effacer un disque dur

Formater un disque dur n'est pas la solution idéale pour vraiment se débarrasser de son contenu. Des outils existent pour récupérer un formatage indésirable. Hier, je me suis retrouvé avec l'idée de revendre un disque. Ce disque contient du code source et j'ai cherché une solution pour effacer son contenu.

J'ai trouvé cet outil : Active@ KillDisk.

A première vue, la version gratuite me suffit. Elle réalise une écriture de zéro sur tout le disque et réduit les chances de récupération pour une personne n'ayant pas la volonté ni les moyens de faire une opération récupération plus complexe.



J'ai utilisé la version bien primaire en fenêtre DOS pour éviter une installation.

Remote Desktop sous Mac (Bureau à Distance)

Je vais parler une fois de plus d'une solution pour accéder à un environnement Windows à partir d'un Mac. Après le bootcamp, la virtualisation, on peut faire du Remote Desktop avec un Mac.

Effectivement, Microsoft fournit gracieusement son client de bureau à distance.

Il faut bien sur dans ce cas avoir une machine Windows qui fonctionne et qui est configuré pour accepter les connexions distantes (Démarrer / Clic Droit sur Mon Ordinateur / Onglet Remote).



Sous Mac, après l'installation, il suffit d'entrer le nom de la machine (ou son IP) et à vous l'accès à la machine.



Pour l'instant, je fais tourner de l'OpenGL, mais une fois de plus, DirectX me pose problème. Attention, ce type de client n'est vraiment pas adapté pour du rendu 3D (imaginé passer 30 FPS par le réseau, ce n'est pas du streaming !).