Permier projet dans Eclipse avec Bitbucket

Bitbucket est un service d'hébergement de repositorys Git et Mercurial, maintenu par la société Atlassian. On peut utiliser une version limitée de ce service gratuitement. La limite étant largement au-dessus de ce que nous présentons sur cette page, vous pouvez suivre ce tutorial jusqu'au bout sans avoir à sortir votre carte bleue.

Pour plus de détails : https://fr.atlassian.com/software/bitbucket/overview.

Ce tutorial a pour objet de configurer un environnement de développement Java sous Eclipse avec Bitbucket. Quatre points sont couverts :

  • la configuration d'un repository Git sous Eclipse ;

  • la configuration d'une connexion Bitbucket sous Eclipse ;

  • la publication d'un projet Eclipse dans Bitbucket ;

  • la récupération d'un projet de Bitbucket dans Eclipse.

Ce tutorial a été rédigé avec la version Luna d'Eclipse. Il est possible que certains écrans varient avec la version actuelle.

La configuration des différents éléments peut paraître fastidieuse. Cela est normal, car elle l'est. Il y a de nombreux éléments à configurer : les différents repository Git (ici on en compte trois : un chez Bitbucket, et deux autres sur deux machines locales différentes) et pour chacun de ces repository une opération de Push et une opération de Pull.

Cela dit, cette configuration se fait une fois seulement en début de projet. Une fois tous ces éléments posés, les mouvements de fichiers source entre les repository sont très simples.

1. Publication d'un projet Eclipse sous Git

Eclipse propose le support natif de Git depuis plusieurs versions déjà. La première tâche que nous allons accomplir consiste à créer un repository Git pour un projet Java sous Eclipse. Nous créerons ensuite quelques commits dans ce repository, afin de le peupler avec quelques données de test.

On part pour cela d'un projet Java vide, sous Eclipse. Pour créer un tel projet, on pourra se référer aux tutoriaux Premiers pas avec Eclipse et Premiers pas avec son projet dans Eclipse, sur Java le soir.

La configuration initiale de notre Eclipse est donc la suivante.

Configuration initiale d'Eclipse

Figure 1. Configuration initiale d'Eclipse


La première chose que nous devons faire est de partager notre projet Eclipse dans Git. Cela se fait dans le menu pop-up du projet, option Team, puis Share project... .

Partage d'un projet sous Git

Figure 2. Partage d'un projet sous Git


Une fenêtre s'ouvre alors, proposant les deux gestionnaires de versions supportés en standard par Eclipse : CVS et Git. On pourra verser une larme de nostalgie en constatant que CVS est toujours là... Notons que le support de SVN, Mercurial, etc... existe sous forme de plugins.

Choisir son gestionnaire de version

Figure 3. Choisir son gestionnaire de version


La fenêtre suivante propose de choisir à quel endroit l'on souhaite créer son repository Git. Eclipse ne recommande pas de choisir le répertoire de son workspace (Eclipse) pour créer un repository Git, cela dit, c'est ce que nous allons faire ici.

Créer son repository Git

Figure 4. Créer son repository Git


On coche donc la case Use or create repository in parent folder of project. On aurait pu choisir un autre répertoire, cela n'aurait pas changé la suite de ce tutorial.

Choix d'un repository dans le répertoire de notre projet

Figure 5. Choix d'un repository dans le répertoire de notre projet


L'aspect de notre projet change dans la vue Package Explorer. Un petit cylindre orange est ajouté sur l'icône de notre projet. Ce cylindre symbolise le fait que notre projet est géré par un gestionnaire de version. Il serait également présent si ce gestionnaire était SVN ou CVS.

On constate qu'Eclipse ajoute également un chevron devant le nom de notre projet. La présence de ce chevron signale que certains fichiers de notre projet ne sont pas sous contrôle de version, ou qu'ils ont été modifiés depuis la dernière validation (commit).

Projet sous contrôle de version

Figure 6. Projet sous contrôle de version


Ouvrons la vue Navigator pour examiner les fichiers de notre projet. Effectivement, la vue Package explorer masque quelques fichiers, notamment les fichiers techniques qu'Eclipse utilise pour gérer les projets. On affiche cette vue de façon classique, dans le menu Windows > Show View > Navigator.

Ouverture de la vue Navigator

Figure 7. Ouverture de la vue Navigator


Cette vue nous montre trois fichiers cachés.

  • .project et .classpath : fichiers techniques gérés par Eclipse.

  • .gitignore : fichier technique utilisé par Git. Ce fichier spécifie les fichiers et répertoires qui ne sont pas pris en compte par Git.

Utilisons ce fichier .gitignore pour exclure les fichiers techniques Eclipse des fichiers sous contrôle de version.

Ajout de fichiers et répertoires de .gitgnore

Figure 8. Ajout de fichiers et répertoires de .gitgnore


Outre les fichiers de configuration d'Eclipse, on exclut également le répertoire bin du contrôle de version, qui contient les classes compilées de notre projet. Ce répertoire peut être entièrement reconstitué à partir du code source, il n'y a donc aucun intérêt à le mettre en contrôle de version.

Notons que l'on pourrait aussi exclure le répertoire target dans le cas d'un projet Maven, et le répertoire .settings, autre élément technique d'Eclipse.

On peut à présent commiter les fichiers appelés à être contrôlés par Git. Cette opération commit signifie que la version que l'on a sous les yeux va être enregistrée par Git, associée à un numéro particulier (code de hachage illisible) et qu'entre autres choses, on pourra y revenir plus tard.

Tout d'abord, on remarque que les fichiers ignorés par Git n'ont plus le petit point d'interrogation qui se trouvait devant leur icône dans la vue Navigator. Dans notre exemple, seul le fichier .gitignore est dans ce cas.

Avant de pouvoir commiter un fichier sous Git, il faut indiquer à Git qu'il doit gérer ce fichier. Cette opération consiste à ajouter ce fichier à Git (add en anglais).

Ajout d'un fichier à Git : opération add

Figure 9. Ajout d'un fichier à Git : opération add


Une fois un fichier ajouté, il apparaît avec un signe "+" devant son icône.

Fichier ajouté à Git

Figure 10. Fichier ajouté à Git


On peut alors commiter les modifications apportées à notre projet. Cela signifie que toutes ces modifications vont être envoyées vers Git, qui va les archiver dans son repository avec soin.

Commit sous Git

Figure 11. Commit sous Git


Eclipse nous ouvre alors une fenêtre dans laquelle nous allons pouvoir indiquer trois choses.

  • La première est un message explicatif sur cette opération de commit. Notons qu'avec Git, ce message est obligatoire. Ceci est une bonne pratique : Git nous oblige à expliquer ce que l'on fait.

  • Le nom de l'auteur de ce commit. Avec Git, pas de commit anonyme.

  • La liste des fichiers effectivement commités. On peut, pour des raisons d'organisation, distribuer une liste de fichiers à commiter dans plusieurs commits.

Premier commit

Figure 12. Premier commit


Une fois notre premier commit effectué notre projet à l'aspect de la figure suivante. Le chevron devant le nom de notre projet a disparu, signe qu'il n'a pas été modifié depuis le dernier commit. Le fichier .gitignore qui est sous contrôle de version est également marqué par un petit cylindre orange.

Aspect d'un projet commité

Figure 13. Aspect d'un projet commité


On peut apporter des modifications à notre projet, et les commiter au fur et à mesure. Commençons par créer une classe Marin.

Classe Marin sous Git

Figure 14. Classe Marin sous Git


Notons que dans ce cas, les deux étapes de add et de commit ont été effectué en une seule passe.

Examinons notre repository après plusieurs modifications de notre classe Marin (ajout de champs, d'une méthode toString(), de méthodes equals() et hashCode()).

On peut pour cela ouvrir la vue History d'Eclipse, sélectionner notre projet dans la vue Package explorer (ou une autre vue équivalente), et cliquer sur le bouton Link with editor de la vue History.

Examiner un repository Git dans Eclipse

Figure 15. Examiner un repository Git dans Eclipse


L'ensemble des commits apparaît alors. Si l'on a créé plusieurs branches (ce qui n'est pas le cas dans notre tutorial), on peut les afficher en cliquant sur le bouton Show all branches.

Examiner l'ensemble des branches et des tags

Figure 16. Examiner l'ensemble des branches et des tags


2. Connexion d'Eclipse à Bitbucket

2.1. Configuration de Bitbucket

Cette section suppose que l'on s'est déjà créé un compte sur Bitbucket et que l'on dispose d'un login et d'un mot de passe. Ce tutorial ne couvre pas la connexion à un repository en SSH, mais en HTTPS.

Rendez-vous donc sur la page de création d'un repository sur Bitbucket. Cela se fait en ligne, sur le site de Bitbucket.

Création d'un repository sur Bitbucket

Figure 17. Création d'un repository sur Bitbucket


On prendra garde de bien créer un repository de type Git et non pas de type Mercurial. L'exemple montre la création d'un repository privé, on peut tout aussi bien créer un repository public, bien entendu.

Une fois notre repository crée, il va nous falloir le connecter à notre repository local, celui que nous avons créé à l'aide d'Eclipse. Il nous faut pour cela obtenir l'URL de notre repository. On peut le faire sur le panneau Overview de l'IHM de Bitbucket. Dans la rubrique I have an existing project se trouve une suite de commandes dans laquelle on peut lire l'URL dont on a besoin (ligne 2).

Lecture de l'URL HTTPS de notre repository Bitbucket

Figure 18. Lecture de l'URL HTTPS de notre repository Bitbucket


On peut donc copier / coller cette URL magique.

Copier / coller de l'URL magique

Figure 19. Copier / coller de l'URL magique


2.2. Connexion d'Eclipse

On configure Eclipse pour qu'il se connecte à notre repository Bitbucket au travers de la vue Git Repository, que l'on ouvre de façon classique. Sur cette vue se trouve déjà le repository que nous avons créé précédemment, local à notre espace de travail.

En ouvrant le nœud de notre repository, on découvre un sous-nœud Remote. Sélectionnons la rubrique Create Remote... de ce nnœud Remote.

Création d'un repository remote

Figure 20. Création d'un repository remote


Eclipse nous demande alors le nom que nous allons donner à ce repository. Le nom par défaut, origin, a une signification particulière dans Git, on le conserve donc. C'est sous ce nom que notre repository Bitbucket apparaîtra dans la vue Git Repository.

Choix du nom du repository remote

Figure 21. Choix du nom du repository remote


Eclipse nous demande alors de configurer l'opération de push vers ce repository. Cette opération consiste à pousser le contenu de notre repository local vers le repository Bitbucket. Le panneau suivant apparaît.

Configuration de l'opération de push

Figure 22. Configuration de l'opération de push


La première chose à faire est de fournir l'URL HTTPS de notre repository Bitbucket. Cliquons donc sur le bouton Change....

Un peu de magie va opérer ici. Il suffit effectivement de coller notre UR HTTPS dans la case URI pour que le panneau suivant se remplisse presque entièrement. Il ne reste plus en fait qu'à saisir notre mot de passe dans la bonne case.

Coordonnées du repository Bitbucket

Figure 23. Coordonnées du repository Bitbucket


On clique ensuite sur Finish, ce qui termine la configuration du repository proprement dit.

Reste à configurer notre opération de push. On clique pour cela sur le bouton Advanced... du panneau suivant.

Configuration du push

Figure 24. Configuration du push


Le panneau suivant apparaît. La configuration est simple. Dans un premier temps on choisit de pousser toutes les branches locales (nous n'en avons en fait qu'une dans ce tutorial). On clique pour cela sur le bouton Add All Branches Spec.

Pousser toutes les branches locales

Figure 25. Pousser toutes les branches locales


Puis on choisit de pousser tous les tags locaux. On clique donc sur le bouton Add All Tags Spec.

Pousser tous les tags locaux

Figure 26. Pousser tous les tags locaux


Une fois ces deux boutons cliqués, notre panneau a l'allure suivante.

Configuration du push terminée

Figure 27. Configuration du push terminée


Ce panneau se ferme lorsque l'on clique sur Finish. On se retrouve alors sur le panneau précédent. Il doit avoir cette allure-la, qui indique que notre configuration est terminée.

Configuration du push terminée (bis)

Figure 28. Configuration du push terminée (bis)


Sauvegardons cette configuration (bouton Save). Notre vue Git Repositories a maintenant l'allure suivante.

Repository Bitbucket dans la vue Git Repository

Figure 29. Repository Bitbucket dans la vue Git Repository


On constate que notre repository Bitbucket apparaît bien sous le nom origin, nom que nous lui avons donné lors de notre configuration.

On constate aussi la présence de deux nœuds : l'un avec une petite flêche verte, l'autre avec une petite flêche rouge. Ces deux éléments symbolisent :

  • flêche rouge : l'opération de push, qui pousse notre repository local vers Bitbucket ;

  • flêche verte : l'opération de pull, qui rapatrie le contenu du repository Bitbucket vers notre repository local.

3. Échanger des données avec un repository Bitbucket

Nous avons donc maintenant deux repository : l'un, local, dans lequel se trouve notre projet Java (plusieurs commits), l'autre sur les serveurs de Bitbucket, dans le cloud. Ce second repository est pour le moment vide, puisque nous n'avons rien mise dedans. Ces deux repository sont configurés pour s'échanger des données, ce que nous allons faire à présent.

3.1. Opération de push : pousser ses données vers Bitbucket

Commençons par pousser notre code Java vers notre repository Bitbucket. Tout est configuré pour y arriver.

Pour cela, on peut sélectionner le nœud qui porte la flêche rouge sortante de notre repository origin dans la vue Git Repository. Le menu pop-up de ce nœud comporte une option Push, que l'on sélectionne.

Effectuer un push vers Bitbucket

Figure 30. Effectuer un push vers Bitbucket


Un premier panneau s'ouvre, qui indique la progression de l'opération. Il se ferme plus ou moins rapidement, en fonction de ce que l'on a à uploader.

Une fois cette opération effectuée, un second panneau s'ouvre, qui nous informe de ce qui a étécfait. Notre branche par défaut (elle s'appelle master) a été envoyée vers Bitbucket.

Effectuer un push vers Bitbucket (bis)

Figure 31. Effectuer un push vers Bitbucket (bis)


On peut alors aller vérifier sur l'IHM Web de Bitbucket que l'ensemble de nos fichiers a bien été envoyé. Notre repository Bitbucket est donc bien peuplé avec notre repository local.

3.2. Opération de fetch : récupérer ses données de Bitbucket

On a donc des données sur notre repository Bitbucket, qui sont la copie de ce que l'on possède en local.

Pour cette section, on suppose qu'une modification a été faite sur notre repository Bitbucket. Cette modification ne provient pas de notre repository local, qui, lui, n'a pas bougé. On souhaite donc rapatrier cette modification en local.

D'où cette modification peut-elle provenir ? En fait de nombreuses sources. Elle peut venir d'un collaborateur, qui travaille sur le même projet que nous. Elle peut venir d'une autre machine que celle qui a servi à créer le repository.

Afin de se mettre dans ce contexte, le plus simple est d'utiliser l'IHM Web de Bitbucket, qui permet de créer des fichiers textes très simplement (bouton New File sur la page Source).

Plus précisément, nous avons créé un fichier README.md manuellement dans notre repositry Bitbucket.

Pour récupérer ces modification (ici juste ce fichier), nous allons utiliser la fonction Fetch de la vue Git Repository. Cela passe par une étape de configuration de cette opération.

Configurer l'opération de Fetch

Figure 32. Configurer l'opération de Fetch


Une fenêtre s'ouvre, analogue à celle qui s'était ouverte pour la configuration du Push. Et effectivement, ces deux opérations se ressemblent.

Panneau de configuration du Fetch

Figure 33. Panneau de configuration du Fetch


De même que pour l'opération de Push, on clique sur le bouton Advanced, ce qui nous ouvre le panneau suivant.

Configuration des branches et des tags pour le Fetch

Figure 34. Configuration des branches et des tags pour le Fetch


La configuration est encore la même : on sélectionne toutes les branches et tous les tags, en cliquant sur les deux boutons qui correspondent. On termine l'opération en cliquant sur Finish.

On se retrouve alors sur le panneau précédent, avec quelques élément cabalistiques, qui indiquent que les choses vont bien se passer.

Branches et tags configurés pour le Fetch

Figure 35. Branches et tags configurés pour le Fetch


Bien sûr, comme pour le Push, cette configuration n'est faite qu'une seule fois.

On peut alors lancer notre opération de Fetch.

Lancement d'un Fetch

Figure 36. Lancement d'un Fetch


Un panneau intermédiaire nous indique ce qui va être fait : rapatrier le code qui se trouve sur Bitbucket en local. Bien sûr, seuls les éléments que l'on ne possède pas déjà sont téléchargés.

Confirmation du Fetch

Figure 37. Confirmation du Fetch


Les données ont été rapatriées, elles se trouvent à présent dans notre repository.

3.3. Fusion des données

Une chose un peu curieuse se passe toutefois : le fichier attendu, README.md n'apparaît pas dans notre projet. Il a pourtant été correctement téléchargé.

Examinons l'état de notre repository par la vue History, que constate-t-on ?

État du repository après le fetch

Figure 38. État du repository après le fetch


Il est possible que la vue History n'affiche pas les commits téléchargés par l'opération de fetch. Si c'est le cas il faut cliquer sur le bouton Show all branches and tags de la vue History. Ce bouton est le dernier de la frise de bouton de la vue History, le plus à droite.

On constate qu'un commit a été ajouté à notre repository, mais que le commit que l'on regarde est toujours le même. Notre repository a bien été mis à jour, mais pas notre espace de travail. Il nous faut donc mettre à jour cet espace de travail avec ce nouveau commit.

Pour cela, nous allons sélectionner le commit que l'on veut mettre dans notre espace de travail, et sélectionner l'option Merge du menu pop-up. Merge signifie fusionner. Nous allons donc fusionner les modifications faites dans ce commit avec ce que nous avons.

Préparation du merge

Figure 39. Préparation du merge


Un panneau intermédiaire nous indique ce qui a été fait.

Information sur le merge

Figure 40. Information sur le merge


Si l'on examine notre repository à l'issue de cette opération, on constate bien que l'on regarde à présent le dernier commit de notre repository, celui dans lequel se trouve le fichier README.md.

Repository après le merge

Figure 41. Repository après le merge


Et de fait, si l'on examine notre projet Java, on constate que le fichier README.md est bien présent.

4. Import d'un repository Bitbucket dans un projet Eclipse vide

4.1. Import d'un repository distant

On se propose enfin d'importer notre projet Java stocké dans Bitbucket sur une machine qui ne connaît pas le projet original. Notre machine n'a donc pas de repository Bitbucket en local. Les choses ne sont pas beaucoup plus compliquées, notamment la configuration du repository Bitbucket ne change pas.

On part donc d'un projet vide, qui ne connaît aucun repository Git. La figure suivante nous montre l'état de notre Eclipse, avec la vue Git Repository sans rien dedans.

Un Eclipse vide (et bien triste)

Figure 42. Un Eclipse vide (et bien triste)


Cliquons sur Clone a Git repository, dans la fenêtre Git Repository.

Clone a Git repository

Figure 43. Clone a Git repository


Eclipse a bien sûr besoin des coordonnées de ce repository. Il nous ouvre donc le même panneau que dans le cas précédent, dans lequel on colle l'URL HTTPS de notre repository. Ce panneau se remplit aussi magiquement, il ne nous reste plus qu'à entrer notre mot de passe.

Coordonnées du repository Bitbucket

Figure 44. Coordonnées du repository Bitbucket


Suit la sélection des branches à rapatrier. Ici nous n'en avons qu'une, le choix est donc assez simple.

Choix des branches à rapatrier

Figure 45. Choix des branches à rapatrier


Cloner un repository distant (ici celui de Bitbucket) consiste aussi à créer un repository local pour accueillir le contenu de ce repository distant. Le panneau suivant nous demande à quel endroit on veut créer ce repository local. Il nous demande également le nom des branches (ici il n'y en n'a qu'une) locales dans lesquelles les branches distantes vont être copiées. Et enfin, il nous demande le nom sous lequel le repository distant (Bitbucket va apparaître).

Sur ce simple panneau, Eclipse nous demande donc toutes les informations que nous lui avions données une par une lors de la configuration précédente.

Configuration du repository d'accueil

Figure 46. Configuration du repository d'accueil


Une fois cet import réalisé, la vue Git Repository nous donne le résultat de la création et de la configuration de notre repository local.

Repository local créé et configuré

Figure 47. Repository local créé et configuré


4.2. Création du projet Java à partir du repository

La deuxième étape de ce processus consiste à créer un projet Java à partir du contenu de ce repository. Pour le moment, le repository est bien importé sur notre poste local, mais nous n'avons pas encore de projet Java.

Il y a plusieurs façons de faire, l'un des plus simples consiste à importer le contenu de du répertoire de travail. On sélectionne pour cela la rubrique Import Project du menu pop-up du nœud Working directory.

Import du projet Java

Figure 48. Import du projet Java


Comme nous avons pris soin de ne pas commiter les fichiers de configuration d'Eclipse dans Git (ce qui était une bonne idée), Eclipse n'est pas capable de reconnaître que notre projet est en fait un projet Java Eclipse. Si notre projet avait été un projet Maven, Eclipse l'aurait reconnu comme tel, et les choses auraient été beaucoup plus simples.

On importe donc notre projet comme un projet générique, nous en ferons un projet Java dans la suite.

Import d'un projet générique

Figure 49. Import d'un projet générique


Eclipse nous demande un nom pour ce projet, ce qu'on lui donne.

Configuration de notre projet

Figure 50. Configuration de notre projet


Notre projet est donc bien créé, il ne s'agit pas d'un projet Java.

Projet générique créé

Figure 51. Projet générique créé


Pour en faire un projet Java, il faut ouvrir le panneau des propriétés du projet, soit par le menu pop-up du projet, soit par le raccourci-clavier Alt-Entrée. Le panneau des (nombreuses) propriétés apparaît alors, on s'intéresse à l'option Project Facets.

Project Facets

Figure 52. Project Facets


Il faut alors cliquer sur le lien Convert to facet form... pour faire de notre projet un projet Java. Le panneau prend alors l'apparence suivante.

Projet converti en projet à facettes

Figure 53. Projet converti en projet à facettes


La facette qui nous intéresse est bien sûr la facette Java, qui est d'ailleurs sélectionnée par défaut. On doit aussi sélectionner la machine Java utilisée pour ce projet dans la partie droite du panneau, onglet Runtimes.

Le panneau correctement renseigné à l'allure suivante.

Projet converti en projet à facettes (bis)

Figure 54. Projet converti en projet à facettes (bis)


On peut enfin cliquer sur le bouton Ok. Notre projet prend alors l'allure d'un projet Java sous Eclipse.

Projet converti en projet Java

Figure 55. Projet converti en projet Java


Cela dit, il semble que notre projet ait subi des petites modifications : effectivement, un chevron est apparu devant son nom, qui indique que des fichiers on été ajoutés ou modifiés dans le processus.

On peut voir ces fichiers en tentant un commit. Le panneau qui apparaît nous montre ce qui a été ajouté. Ce commit ne doit surout pas être validé, on clique donc sur le bouton Cancel pour fermer cette fenêtre.

Fichiers ajoutés lors de la conversion

Figure 56. Fichiers ajoutés lors de la conversion


Ce sont donc bien des fichiers techniques Eclipse qui ont été ajoutés, rangés dans le répertoire .settings. On ne veut pas de ces fichiers dans notre repository, il faut donc ajouter le répertoire .settings à notre fichier .gitignore pour indiquer à Git de les ignorer.

On peut accéder à ce fichier directement du nœud Working Directory de notre repository, et l'éditer normalement. Ici nous avons ajouter la ligne .settings/ à la fin de ce fichier.

Edition de gitignore

Figure 57. Edition de gitignore


Notre projet est toujour en modification, mais cette fois il s'agit du fichier .gitignore, que nous pouvons effectivement commiter.

Commit de gitignore

Figure 58. Commit de gitignore


À partir de ce moment, nous avons un projet Java sur notre poste local, qui est une copie de ce qui se trouve dans notre repository Bitbucket. On peut donc modifier ce projet, pousser nos modifications dans Bitbucket, et les récupérer sur noter autre poste de la même façon.

Eclipse & Bitbucket
Retour au blog Java le soir
Cours & Tutoriaux