-
1. DĂ©marrage rapide
-
2. Les bases de Git
-
3. Les branches avec Git
-
4. Git sur le serveur
- 4.1 Protocoles
- 4.2 Installation de Git sur un serveur
- 4.3 Génération des clés publiques SSH
- 4.4 Mise en place du serveur
- 4.5 DĂ©mon (Daemon) Git
- 4.6 HTTP intelligent
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Git hébergé
- 4.10 Résumé
-
5. Git distribué
-
6. GitHub
-
7. Utilitaires Git
- 7.1 SĂ©lection des versions
- 7.2 Indexation interactive
- 7.3 Remisage et nettoyage
- 7.4 Signer votre travail
- 7.5 Recherche
- 7.6 RĂ©Ă©crire lâhistorique
- 7.7 Reset démystifié
- 7.8 Fusion avancée
- 7.9 Rerere
- 7.10 DĂ©boguer avec Git
- 7.11 Sous-modules
- 7.12 Empaquetage (bundling)
- 7.13 Replace
- 7.14 Stockage des identifiants
- 7.15 Résumé
-
8. Personnalisation de Git
- 8.1 Configuration de Git
- 8.2 Attributs Git
- 8.3 Crochets Git
- 8.4 Exemple de politique gérée par Git
- 8.5 Résumé
-
9. Git et les autres systĂšmes
- 9.1 Git comme client
- 9.2 Migration vers Git
- 9.3 Résumé
-
10. Les tripes de Git
- 10.1 Plomberie et porcelaine
- 10.2 Les objets de Git
- 10.3 Références Git
- 10.4 Fichiers groupés
- 10.5 La refspec
- 10.6 Les protocoles de transfert
- 10.7 Maintenance et récupération de données
- 10.8 Les variables dâenvironnement
- 10.9 Résumé
-
A1. Annexe A: Git dans dâautres environnements
- A1.1 Interfaces graphiques
- A1.2 Git dans Visual Studio
- A1.3 Git dans Visual Studio Code
- A1.4 Git dans IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git dans Sublime Text
- A1.6 Git dans Bash
- A1.7 Git dans Zsh
- A1.8 Git dans PowerShell
- A1.9 Résumé
-
A2. Annexe B: Embarquer Git dans vos applications
- A2.1 Git en ligne de commande
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Commandes Git
- A3.1 Installation et configuration
- A3.2 Obtention et création des projets
- A3.3 Capture dâinstantanĂ© basique
- A3.4 Création de branches et fusion
- A3.5 Partage et mise Ă jour de projets
- A3.6 Inspection et comparaison
- A3.7 DĂ©bogage
- A3.8 Patchs
- A3.9 Courriel
- A3.10 SystĂšmes externes
- A3.11 Administration
- A3.12 Commandes de plomberie
A2.3 Annexe B: Embarquer Git dans vos applications - JGit
JGit
Si vous voulez utiliser Git depuis un programme Java, il existe une bibliothĂšque complĂšte appelĂ©e JGit. JGit est une rĂ©alisation relativement complĂšte de Git Ă©crite nativement en Java etelle est largement utilisĂ©e dans la communautĂ© Java. Le projet JGit est dĂ©veloppĂ© sous lâĂ©gide dâEclipse et son site se trouve sur https://www.eclipse.org/jgit.
Mise en place
Il y a diffĂ©rents moyens de connecter votre projet Ă JGit et de commencer Ă lâutiliser dans votre code.
La maniĂšre probablement la plus facile consiste Ă utiliser Maven â on rĂ©alise lâintĂ©gration en ajoutant la section suivante sous la balise <dependencies>
de votre fichier pom.xml :
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>3.5.0.201409260305-r</version>
</dependency>
La version
aura trÚs certainement évolué lorsque vous lirez ces lignes ; vérifiez https://www.eclipse.org/jgit/download pour une information de version mise à jour.
Une fois cette étape accomplie, Maven va automatiquement récupérer et utiliser les bibliothÚques JGit dont vous aurez besoin.
Si vous prĂ©fĂ©rez gĂ©rer les dĂ©pendances binaires par vous-mĂȘme, des binaires JGit prĂ©-construits sont disponibles sur https://www.eclipse.org/jgit/download. Vous pouvez les inclure dans votre projet en lançant une commande telle que :
javac -cp .:org.eclipse.jgit-3.5.0.201409260305-r.jar App.java
java -cp .:org.eclipse.jgit-3.5.0.201409260305-r.jar App
Plomberie
JGit propose deux niveaux gĂ©nĂ©raux dâinterfaçage logiciel : plomberie et porcelaine. La terminologie de ces niveaux est directement calquĂ©e sur celle de Git lui-mĂȘme et JGit est partitionnĂ© globalement de la mĂȘme maniĂšre : les APIs de porcelaine sont une interface de haut niveau pour des interactions de niveau utilisateur (le genre de choses quâun utilisateur normal ferait en utilisant la ligne de commande), tandis que les APIs de plomberie permettent dâinteragir directement avec les objets de bas niveau du dĂ©pĂŽt.
Le point de départ pour la plupart des sessions JGit est la classe Repository
et la premiÚre action consiste à créer une instance de celle-ci.
Pour un dĂ©pĂŽt basĂ© sur un systĂšme de fichier (hĂ© oui, JGit permet dâautre modĂšles de stockage), cela passe par lâutilisation dâun FileRepositoryBuilder
 :
// Creer un nouveau depot
Repository newlyCreatedRepo = FileRepositoryBuilder.create(
new File("/tmp/new_repo/.git"));
newlyCreatedRepo.create();
// Ouvrir un depot existant
Repository existingRepo = new FileRepositoryBuilder()
.setGitDir(new File("my_repo/.git"))
.build();
Le constructeur contient une API souple qui fournit tout ce dont il a besoin pour trouver un dĂ©pĂŽt Git, que votre programme sache ou ne sache pas exactement oĂč il est situĂ©.
Il peut utiliser des variables dâenvironnement (.readEnvironment()
), dĂ©marrer depuis le rĂ©pertoire de travail et chercher (setWorkTree(âŠ).findGitDir()
) ou juste ouvrir un répertoire .git
connu, comme ci-dessus.
Une fois muni dâune instance de Repository
, vous pouvez faire toutes sortes de choses avec.
En voici un échantillon rapide :
// acceder a une reference
Ref master = repo.getRef("master");
// acceder a l'objet pointe par une reference
ObjectId masterTip = master.getObjectId();
// Rev-parse
ObjectId obj = repo.resolve("HEAD^{tree}");
// Charger le contenu brut d'un objet
ObjectLoader loader = repo.open(masterTip);
loader.copyTo(System.out);
// Creer une branche
RefUpdate createBranch1 = repo.updateRef("refs/heads/branch1");
createBranch1.setNewObjectId(masterTip);
createBranch1.update();
// Delete a branch
RefUpdate deleteBranch1 = repo.updateRef("refs/heads/branch1");
deleteBranch1.setForceUpdate(true);
deleteBranch1.delete();
// Config
Config cfg = repo.getConfig();
String name = cfg.getString("user", null, "name");
Il y a pas mal de choses mises en Ćuvre ici, donc nous allons dĂ©tailler chaque section.
La premiÚre ligne récupÚre un pointeur sur la référence master
.
JGit récupÚre automatiquement la référence master réelle qui se situe dans refs/heads/master
et retourne un objet qui vous permet de récupérer des informations sur cette référence.
Vous pouvez récupérer le nom (.getName()
) ou bien lâobjet cible de la rĂ©fĂ©rence directe (.getObjectId()
), ou encore la référence pointée par une référence symbolique (.getTarget()
).
Les objets de rĂ©fĂ©rence sont aussi utilisĂ©s pour reprĂ©senter les rĂ©fĂ©rences dâĂ©tiquette ou des objets, donc vous pouvez demander si lâĂ©tiquette est « pelĂ©e », ce qui signifie quâelle pointe sur une cible finale dâune sĂ©rie (potentiellement longue) dâobjets Ă©tiquettes.
La seconde ligne donne la cible de la référence master
qui est retournĂ©e comme une instance dâObjectId.
ObjectId reprĂ©sente lâempreinte SHA-1 dâun objet qui peut exister ou non dans la base de donnĂ©es des objets de Git.
La troisiĂšme ligne est similaire, mais elle montre comment JGit gĂšre la syntaxe « rev-parse » (pour plus dâinformation, voir RĂ©fĂ©rences de branches).
Vous pouvez passer nâimporte quel spĂ©cificateur dâobjet que Git comprend et JGit retournera un ObjectId valide ou bien null
.
Les deux lignes suivantes montrent comment charger le contenu brut dâun objet.
Dans cet exemple, nous appelons ObjectLoader.copyTo()
pour rediriger le contenu de lâobjet directement sur la sortie standard, mais ObjectLoader
dispose aussi de mĂ©thodes pour lire le type et la taille dâun objet et le retourner dans un tableau dâoctets.
Pour les gros objets (pour lesquels .isLarge()
renvoie true
), vous pouvez appeler .openStream()
pour rĂ©cupĂ©rer un objet similaire Ă InputStream qui peut lire lâobjet brut sans le tirer intĂ©gralement en mĂ©moire vive.
Les quelques lignes suivantes montrent ce qui est nécessaire pour créer une nouvelle branche.
Nous créons une instance de RefUpdate, configurons quelques paramÚtres et appelons .update()
pour déclencher la modification.
Le code pour effacer cette branche suit juste aprĂšs.
Notez que .setForceUpdate(true)
est nĂ©cessaire pour que cela fonctionne ; sinon lâappel Ă .delete()
retourne REJECTED
et il ne se passera rien.
Le dernier exemple montre comment récupérer la valeur user.name
depuis les fichiers de configuration de Git.
Cette instance de Config utilise le dépÎt que nous avons ouvert plus tÎt pour la configuration locale, mais détectera automatiquement les fichiers de configuration globale et systÚme et y lira aussi les valeurs.
Ceci nâest quâun petit Ă©chantillon de toute lâAPI de plomberie ; il existe beaucoup dâautre mĂ©thodes et classes.
Ici, nous ne montrons pas non plus comment JGit gĂšre les erreurs, au moyen dâexceptions.
Les APIs JGit lancent quelques fois des exceptions Java standard (telles que IOException
), mais il existe aussi une liste de types dâexception spĂ©cifiques Ă JGit (tels que NoRemoteRepositoryException
, CorruptObjectException
et NoMergeBaseException
).
Porcelaine
Les APIs de plomberie sont plutĂŽt complĂštes, mais il peut sâavĂ©rer lourd de les enchaĂźner pour des activitĂ©s frĂ©quentes, telles que lâajout de fichier Ă lâindex ou la validation.
JGit fournit un ensemble de plus haut niveau dâAPIs pour simplifier celles-ci et le point dâentrĂ©e pour ces APIs est la classe Git
 :
Repository repo;
// construit le depot...
Git git = new Git(repo);
La classe Git propose un joli ensemble de méthodes de haut niveau de style builder
qui peuvent ĂȘtre utilisĂ©es pour construire des comportements assez complexes.
Voyons un exemple, tel que recréer quelque chose comme git ls-remote
 :
CredentialsProvider cp = new UsernamePasswordCredentialsProvider("username", "p4ssw0rd");
Collection<Ref> remoteRefs = git.lsRemote()
.setCredentialsProvider(cp)
.setRemote("origin")
.setTags(true)
.setHeads(false)
.call();
for (Ref ref : remoteRefs) {
System.out.println(ref.getName() + " -> " + ref.getObjectId().name());
}
Câest la structure habituelle avec la classe Git ; les mĂ©thodes renvoient un objet commande qui permet dâenchaĂźner les appels de paramĂ©trage qui sont finalement exĂ©cutĂ©s par lâappel Ă .call()
.
Dans notre cas, nous interrogeons le dépÎt distant origin
sur ses Ă©tiquettes, et non sur ses sommets de branches.
Notez aussi lâutilisation dâun objet CredentialsProvider
pour lâauthentification.
De nombreuses autres commandes sont disponibles au travers de la classe Git, dont entre autres add
, blame
, commit
, clean
, push
, rebase
, revert
et reset
.
Pour aller plus loin
Tout ceci nâest quâun mince Ă©chantillon de toutes les capacitĂ©s de JGit. Si vous ĂȘtes intĂ©ressĂ© et souhaitez en savoir plus, voici des liens vers plus dâinformation et dâinspiration :
-
La documentation officielle de lâAPI JGit est disponible sur https://www.eclipse.org/jgit/documentation. Il existe des Javadoc standard, donc votre EDI JVM favori sera aussi capable de les installer localement.
-
Le livre de recettes JGit https://github.com/centic9/jgit-cookbook contient de nombreux exemples de réalisation de différentes tùches avec JGit.