Le chapitre d’introduction de la partie a évoqué les enjeux, présentés de manière synthétique dans un cours dédié fait avec Romain Avouac
Dérouler les slides ci-dessous ou cliquer ici pour afficher les slides en plein écran.
Ce chapitre va être l’occasion de faire ses premiers pas avec Git
. Le prochain chapitre sera consacré au travail collaboratif. Ce chapitre propose, pour simplifier l’apprentissage, d’utiliser l’extension Git
de VSCode
ou de JupyterLab
. VSCode
propose
probablement, à l’heure actuelle, l’extension la plus complète. Certains passages de ce TD nécessitent d’utiliser la ligne de commande.
Il est tout à fait possible de réaliser ce TD entièrement avec la ligne de commande.
Cependant, pour une personne débutante en Git
, l’utilisation d’une
interface graphique peut constituer un élément important pour
la compréhension et l’adoption de Git
. Une fois à l’aise avec
Git
, on peut tout à fait se passer des interfaces graphiques
pour les routines quotidiennes et ne les utiliser que
pour certaines opérations où elles s’avèrent fort pratiques
(notamment la comparaison de deux fichiers avant de devoir fusionner).
Pour comprendre les analogies avec le versionnage artisanal à la main, rappelons nous le principe de celui-ci avec la Figure 1
Il est vivement recommandé de privilégier VSCode
pour l’apprentissage de Git
. Son extension est très bien faite, bien meilleure que celle de Jupyter
.
Colab
n’embarque pas, nativement, d’extension Git
. Des sauvegardes automatiques sont possibles sur Github
mais ce n’est pas une pratique à encourager. Pire encore, Colab
proposera plutôt une intégration avec Drive
, un autre produit Google
. Certes le notebook sera versionné puisque Drive
embarque des sauvegardes de version mais ce n’est pas une technologie faite pour les sauvegardes de code ; elle n’apportera pas les bénéfices de Git
qui seront évoqués ultérieurement.
Les élèves de l’ENSAE, et plus globalement l’ensemble des personnes pouvant bénéficier de l’infrastructure du SSPCloud1,
ont à disposition des environnements de développement Python
avec Git
préinstallé et accessible par l’intermédiaire d’interfaces connectées aux IDE. Ce notebook est lançable sur cette infrastructure par le biais de ces boutons
Si vous n’êtes pas éligibles au SSPCloud
, le chemin pour obtenir un environnement prêt à l’emploi pour Git
et Python
est plus tortueux. Il est recommandé de télécharger et installer VSCode
, d’ajouter a minima les extensions Python
et GitLens
. Il est bien sûr possible d’aller plus loin dans la customisation de l’environnement de développement mais ce sont les briques minimales pour avoir un environnement local fonctionnel et ergonomique.
1 Avant de démarrer: créer un compte Github
et créer une copie de travail
La première étape se fait sur Github
. et consiste à se créer un compte sur cette plateforme.
Il est important de suivre pas à pas les consignes, chaque étape est importante
- Si vous n’en avez pas déjà un, créer un compte sur github.com
- Créer un dépôt en suivant les consignes ci-dessous.
- Créer ce dépôt privé, cela permettra dans l’exercice 2 d’activer notre jeton. Vous pourrez le rendre public après l’exercice 2, c’est comme vous le souhaitez.
- Créer ce dépôt avec un
README.md
en cliquant sur la caseAdd a README file
- Ajouter un
.gitignore
en sélectionnant le modèlePython
Connexion sur https://github.com > + (en haut de la page) > New repository > Renseigner le “Repository name” > Cocher “private” > “Create repository”
2 Quelques bases sur Git
2.1 Version distante, version locale
Nous avons, avec l’exercice précédent, créé un premier dépôt. Il s’agit d’un dépôt centralisé qui va servir de source de vérité pour notre projet et par l’intermédiaire duquel interagissent les contributeurs.trices d’un projet. Mais nous n’avons pas parlé de comment le faire évoluer, pour cela il faut créer des copies de travail.
Git
est un système décentralisé de contrôle de version2. Cela signifie que les contributeurs.trices modifient les fichiers dans leur éditeur de prédilection puis soumettent ceux-ci pour mettre à jour la source de vérité, le dépôt distant.
Nous reviendrons plus précisément sur #fig-local-remote par la suite et notamment les nombreux termes techniques indiqués dessus. Mais la compréhension de cette distinction fondamentale entre dépôt distant et dépôt local était importante pour pouvoir démarrer. On appelle forge une plateforme qui stocke des dépôts distants. Dans ce cours, nous allons présenter Github
mais il en existe d’autres, notamment Gitlab
.
Github
et Gitlab
sont les deux forges les plus connues mais il en existe de nombreuses autres.Nous avons créé notre dépôt distant à l’exercice principal. Comme créer une version de travail ? Cette opération s’appelle faire un clône (git clone
). L’objectif du prochain exercice est de faire cette opération, ce qui nécessite néanmoins la compréhension du concept d’authentification avant de pouvoir commencer celui-ci.
clone
: récupération d’un dépôt distant et de son historique en créant une copie localeBien qu’il soit possible d’avoir une utilisation hors-ligne de Git
,
c’est-à-dire un pur contrôle de version local sans dépôt
distant, cela est une utilisation
rare et qui comporte un intérêt limité. L’intérêt de Git
est
d’offrir une manière robuste et efficace d’interagir avec un
dépôt distant facilitant ainsi la collaboration en équipe ou en
solitaire.
Github
?
Pour ces exercices, il est proposé
d’utiliser Github
, la forge la plus visible[^1].
L’avantage de Github
par rapport à son principal concurrent, Gitlab
,
est que le premier est plus visible, car
mieux indexé par Google
et concentre, en partie pour des raisons historiques, plus
de développeurs Python
et R
(ce qui est important dans des domaines comme
le code où les externalités de réseau jouent).
Etre familiarisé à
l’environnement Gitlab
reste utile car beaucoup de forges logicielles
internes reposent sur les fonctionalités open-source (l’interface graphique
en faisant parti) de Gitlab
. Il est donc fort utile de maîtriser
les fonctionalités coeur de ces deux interfaces qui sont en fait quasi-identiques. Cela tombe bien, c’est l’objet de ce chapitre et du suivant.
2.1.1 S’authentifier à Github
avec un jeton: principe
Git
est un système décentralisé de contrôle de version :
les codes sont modifiés par chaque personne sur son poste de travail,
puis sont mis en conformité avec la version collective disponible
sur le dépôt distant au moment où le contributeur le décide.
Il est donc nécessaire que la forge connaisse l’identité de chacun des
contributeurs, afin de déterminer qui est l’auteur d’une modification apportée
aux codes stockés dans le dépôt distant.
Pour que Github
reconnaisse un utilisateur proposant des modifications,
il est nécessaire de s’authentifier (un dépôt distant, même public, ne peut pas être modifié par n’importe qui). L’authentification consiste ainsi à fournir un élément que seul vous et la forge êtes censés connaître : un mot de passe, une clé compliquée, un jeton d’accès…
Plus précisément, il existe deux modalités pour faire connaître son identité à Github
:
- une authentification HTTPS (décrite ici) : l’authentification se fait avec un login et un mot de passe ou avec un token (un mot de passe compliqué généré automatiquement par
Github
et connu exclusivement du détenteur du compteGithub
) ; - une authentification SSH : l’authentification se fait par une clé cryptée disponible sur le poste de travail et que
GitHub
ouGitLab
connaît. Une fois configurée, cette méthode ne nécessite plus de faire connaître son identité : l’empreinte digitale que constitue la clé suffit à reconnaître un utilisateur. Ce n’est pas la méthode que nous appliquerons ici3.
Depuis Août 2021, Github
n’autorise plus l’authentification par mot de passe
lorsqu’on interagit (pull
/push
) avec un dépôt distant
(raisons ici).
Il est nécessaire d’utiliser un token (jeton d’accès) qui présente l’avantage
d’être révoquable (on peut à tout moment supprimer un jeton si, par exemple,
on suspecte qu’il a été diffusé par erreur) et à droits limités
(le jeton permet certaines opérations standards mais
n’autorise pas certaines opérations déterminantes comme la suppression
d’un dépôt).
GitHub commencera progressivement à exiger que tous les utilisateurs de GitHub activent une ou plusieurs formes d’authentification à deux facteurs (2FA). Pour plus d’informations sur le déploiement de l’inscription 2FA, consultez cet article de blog. Concrètement, cela signifie que vous devrez au choix :
- Renseigner votre numéro de portable pour valider certaines connexions grâce à un code que vous recevrez par sms ;
- Installer une application d’authentification (Ex : Microsoft Authenticator) installée sur votre téléphone qui génèrera un QR code que vous pourrez scanner depuis github, ce qui ne nécessite pas que vous ayez à fournir votre numéro de téléphone
- Utiliser une clef USB de sécurité
Pour choisir entre ces différentes options, vous pouvez vous rendre sur Settings > Password and authentication > Enable two-factor authentication.
2.1.2 Créer un jeton
La documentation officielle comporte un certain nombre de captures d’écran expliquant comment procéder. En gardant cette documentation ouverte en cas de doute, et les instructions du prochain exercice, nous allons pouvoir créer un jeton d’authentification.
Suivre la
documentation officielle en ne donnant que les droits repo
au jeton4.
Pour résumer les étapes devraient être les suivantes :
Settings (account) > Developers Settings > Personal Access Token > Tokens (classic) > Generate a new token (classic) > “MyToken” > Expiration “90 days” > cocher juste “repo” > Generate token > Le copier
⚠️ Gardez la page ouverte, le token n’apparaît qu’une fois et nous n’avons pas encore fait l’effort de le stocker à un endroit pérenne. Cela sera l’objet du prochain exercice. Néanmoins pas d’inquiétude si vous avez perdu le token avant de pouvoir le sauvegarder, vous pouvez en regénérer un nouveau en suivant à nouveau la procédure ci-dessus.
Nous avons créé un token et comme cela est indiqué sur la page de Github
ou dans les consignes de l’exercice, celui-ci n’est pas pérenne. Il va donc falloir trouver un moyen de conserver celui-ci quelque part. Nous allons proposer plusieurs solutions pour cela. Ecrire celui-ci dans un fichier texte créé avec le bloc note ne fait pas parti de ces solutions, au contraire c’est une très mauvaise pratique.
Il est important de ne jamais stocker un token, et encore moins son mot de passe, dans un projet.
Il est possible de stocker un mot de passe ou token de manière sécurisée et durable
avec le credential helper de Git
. Celui-ci est présenté par la suite.
S’il n’est pas possible d’utiliser le credential helper de Git
, un mot de passe
ou token peut être stocké de manière sécurisé dans
un système de gestion de mot de passe comme Keepass.
Ne jamais stocker un jeton Github
, ou pire un mot de passe, dans un fichier
texte non crypté. Les logiciels de gestion de mot de passe
(comme Keepass, recommandé par l’Anssi)
sont simples
d’usage et permettent de ne conserver sur l’ordinateur qu’une version
hashée du mot de passe qui ne peut être décryptée qu’avec un mot de passe
connu de vous seuls.
Le SSPCloud
propose un service de stockage d’un jeton qui peut ensuite servir facilement pour s’authentifier sur Github
quand on utilise VSCode
ou Jupyter
.
- Copier le jeton qui est affiché sur la page de
Github
qui a été ouverte précédemment. Ne faites pas la sélection des lettres à la main, utilisez le bouton dédié au copier-coller () - Cliquer sur la section “Mon Compte” du
SSPCloud
. Aller dans l’ongletGit
et coller la valeur précédemment copiée.
On peut s’arrêter à ce stade, nous utiliserons ce jeton lors du prochain exercice.
La solution recommandée est de stocker son jeton dans un un gestionnaire de mot de passe comme Keepass (recommandé par l’Anssi). Il s’agit d’un logiciel qui stocke, de manière chiffrée, les mots de passe qui y sont conservés selon la logique du coffre fort numérique.
Au-delà de l’intérêt pour stocker un jeton Github pour ce cours, ces logiciels sont très pratiques au quotidien et sécurisent l’accès à des services numériques sensibles. Ils comportent aussi des générateurs de mot de passe forts qui permettent de réduire les risques d’usurpation numérique en rendant quasi-impossible des techniques comme l’attaque par force brute.
Maintenant que nous avons stocké notre jeton dans un endroit sécurisé, nous pouvons passer à l’étape suivante qui consiste à récupérer notre dépôt distant dans une copie de travail, opération qui nous amènera à réellement utiliser le jeton que nous avons mis de côté pour le moment.
Sur le SSPCloud, se rendre dans la page Mes Services.
Cliquer sur
➕ Nouveau service
et choisir un servicevscode-python
(ne pas en prendre un autre).Laisser les paramètres par défaut et lancer le service.
Une fois le service prêt, cliquer sur le bouton “Cliquez pour copier le mot de passe du service”. Cela va stocker le mot de passe du service (généré aléatoirement, celui-ci n’a rien à voir avec votre mot de passe général du
SSPCloud
) dans le presse papier. Ce mot de passe est également visible en clair dans la partie qui est caviardée sur la Figure 2.2.
Coller ce mot de passe dans le champ
Password
qui s’affiche quand vous ouvrez le service.Dans un autre onglet, récupérer, sur la page d’accueil de votre dépôt, l’url du dépôt distant qui est accessible en cliquant à droite sur le bouton vert
<> Code
. L’URL prend la forme suivante
https://github.com/<username>/<reponame>.git
- Ouvrir le terminal (
☰ > Terminal > New Terminal
) et commencer à taper
# coller votre url de la forme https://github.com/<username>/<reponame>.git git clone
pour coller à la suite votre URL, si CTRL+V est bloqué par le navigateur, vous pouvez faire MAJ+Inser. Taper Entrée.
Une page va s’ouvrir “The extension ‘GitHub’ wants to sign in using GitHub”. Refuser en cliquant sur “Cancel” (les questions optionnelles montrent ce qu’il se passe quand vous acceptez, vous basculez sur un autre mode d’authentification).
Dans la fenêtre en haut, taper votre username d’abord. Puis lorsqu’il vous demande votre mot de passe, coller votre token, pas votre mot de passe
Github
(si vous avez toujours la pageGithub
ouverte, le copier de là, sinon en retournant sur la page Mon compte duSSPCloud
)Observer la mise à jour de l’explorateur de fichiers sur
VSCode
, votreREADME
et votre.gitignore
visibles surGithub
doivent maintenant être là.Taper
cd mon-petit-projet
en supposant que le dossier de votre dépôt s’appellemon-petit-projet
. Puis tapergit remote -v
, une commande qui demande àGit
de voir où pointeorigin
, votre dépôt distant. La réponse devrait être l’URL que vous avez renseigné précedemment
Ceci était une illustration nécessaire pour comprendre le principe de l’authentification. Le prochain exercice (4b) proposera une manière plus directe de fonctionner, qu’il est utile de connaître car elle vous évitera d’avoir à vous authentifier à chaque interaction avec le dépôt distant.
En option, pour comprendre la différence avec l’authentification déléguée proposée par VSCode, vous pouvez faire, de manière optionnelle, les consignes suivantes:
Toujours dans le même VSCode, ouvrir un nouveau terminal (
☰ > Terminal > New Terminal
)Taper
git clone https://github.com/<username>/<reponame>.git repo-bis
en remplaçanthttps://github.com/<username>/<reponame>.git
par l’URL de votre dépôt. Cela clônera votre dépôt dans le dossierrepo-bis
quand vous serez effectivement authentifié.Cette fois accepter l’authentification déléguée proposée par VSCode. Il s’agit d’une authentification à deux facteurs:
- Le premier facteur d’authentification est le code que
Github
vous demande de copier et de renseigner dans la page queVSCode
désire ouvrir (il faut que vous acceptiez de copier et d’ouvrir la page). Coller ce code à 8 caractères, valider et accepter les droits demandés par l’application. - Le deuxième facteur est le code de votre application d’authentification (par exemple
Google Authenticator
ou celui que vous recevez par SMS). Mettre celui-ci et valider, le clône devrait démarrer
- Le premier facteur d’authentification est le code que
Cet exercice vient de nous illustrer le principe de l’authentification et la manière dont VSCode
peut attester de votre identité grâce à un token ou à une double authentification. L’exercice suivant propose une méthode d’authentification par token un peu plus pratique que celle que nous avions mise en oeuvre ☝️.
Cette approche montre comment le SSPCloud injecte lors de la création d’un service VSCode le token et le dépôt que vous désirez clôner.
Sur le SSPCloud, se rendre dans la page Mes Services. Vous pouvez supprimer le service existant, il n’est plus nécessaire.
Cliquer sur
➕ Nouveau service
et choisir un servicevscode-python
(ne pas en prendre un autre).
- Dans un autre onglet, récupérer, sur la page d’accueil de votre dépôt, l’url du dépôt distant qui est accessible en cliquant à droite sur le bouton vert
<> Code
. L’URL prend la forme suivante
https://github.com/<username>/<reponame>.git
Dérouler le menu
Configuration Vscode-python
et chercher l’ongletGit
Dans celui-ci, vous devriez voir votre token pré-injecté dans le formulaire. Ne le changez pas.
Dans un autre onglet, récupérer, sur la page d’accueil de votre dépôt, l’url du dépôt distant qui est accessible en cliquant à droite sur le bouton vert
<> Code
. L’URL prend la forme suivante
https://github.com/<username>/<reponame>.git
Vous pouvez utiliser l’icone à droite pour copier l’url.
Coller celle-ci dans le champ
Repository
du formulaire de création du service sur leSSPCloud
. Lancer le service et attendre qu’il se crée (une vingtaine de secondes).Le clône du dépôt distant devrait être visible dans l’aborescence des fichiers.
Ouvrir le terminal (
☰ > Terminal > New Terminal
) et tapergit remote -v
, une commande qui demande àGit
de voir où pointeorigin
, votre dépôt distant. La réponse prend la forme:
//ghp_XXXX@github.com/username/repository.git https:
qui se distingue de l’URL que vous aviez renseigné dans l’onglet Git
.
Comme vous pouvez le voir avec cette méthode, le jeton est en clair. C’est pour cette raison qu’on utilise, plutôt que des mots de passe, des jetons
puisque, si ces derniers sont révélés, on peut toujours les révoquer et éviter
les problèmes
Le mode opératoire est très proche. En pratique, la seule différence est qu’il n’y a pas besoin de créer de nouveau service puisqu’une installation de VSCode
existe déjà.
- Sur votre navigateur, récupérer, sur la page d’accueil de votre dépôt, l’url du dépôt distant qui est accessible en cliquant à droite sur le bouton vert
<> Code
. L’URL prend la forme suivante
https://github.com/<username>/<reponame>.git
- Ouvrir le terminal (
Terminal > New Terminal
) et commencer à taper
git clone
et coller la valeur copiée précédemment. Ne validez pas. Avec les touches directionnelles, se placer entre https://
et github.com
. Récupérer dans votre navigateur ou Keepass
votre jeton Github
. Coller celui-ci puis ajouter @
. Cela devrait donner
//ghp_XXXX@github.com/username/repository.git https:
Ce qui, dans l’ensemble, fera
//ghp_XXXX@github.com/username/repository.git git clone https:
- Le clône du dépôt distant devrait être visible dans l’aborescence des fichiers.
Comme vous pouvez le voir avec cette méthode, le jeton est en clair. C’est pour cette raison qu’on utilise, plutôt que des mots de passe, des jetons puisque, si ces derniers sont révélés, on peut toujours les révoquer et éviter les problèmes
2.2 La staging area
Git
avant validation de nouvelles modifications dans l’histoire d’un fichier.Dans un monde sans Git
, on écrit du code, on sauvegarde son script et parfois on considère que cette version vaut le coup d’être considérée comme une version de laquelle repartir. Avec Git
c’est la même chose, seulement se principe sera formalisé plus proprement.
Le premier niveau conceptuel est celui de l’index des modifications. Il s’agit des modifications en attente de validation, d’où le nom de staging area dans la première partie de Figure 2.3.
En principe, quand on édite des scripts ou notebooks, on enregistre régulièrement ceux-ci. Le niveau d’implication suivant est de mettre de côté une version particulière de ceux-ci, ce qu’à la main (voir la Figure 1), nous ferions en dupliquant le fichier. Cela implique de mettre une ou plusieurs modifications dans la liste d’attente des modifications à valider. Cette opération s’appelle git add
et est l’objet du prochain exercice.
Créer un dossier 📁
scripts
dans le dossier de votre dépôt. SurVSCode
, vous pouvez utiliser les icônes adaptées.Y créer les fichiers
script1.py
etscript2.py
, chacun contenant quelques commandesPython
de votre choix (le contenu de ces fichiers n’est pas important).Se rendre dans l’extension
Git
deVSCode
. Vous devriez retrouver un cadre ayant cet aspect
En ligne de commande, c’est l’équivalent de
git status
- Sur
VSCode
, un bouton+
figure à droite du nom du fichier.script1.py
et.script2.py
. SurJupyter
, en passant votre souris au dessus du nom des fichiersscript1.py
etscript2.py
, vous devriez voir un+
apparaître. Cliquez dessus.
Si vous aviez privilégié la ligne de commande, ce que vous avez fait est équivalent à :
git add scripts/script1.py
git add scripts/script2.py
- Observer le changement de statut du fichier après avoir cliqué sur
+
. Il est désormais dans la partieStaged
.
En gros, vous venez de dire à Git
que vous allez rendre publique une évolution
du fichier, mais vous ne l’avez pas encore fait (Staged
est une liste d’attente).
Si vous étiez en ligne de commande vous auriez ce résultat après un git status
On branch main
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: .gitignore
Les nouvelles modifications (en
l’occurrence la création du fichier et la validation de son contenu actuel)
ne sont pas encore archivées. Pour cela, il va falloir faire un
commit
(on s’engage en rendant publique une modification).
Modifier le contenu d’une ligne déjà existante dans le
README.md
et faire la même gymnastique d’ajout à l’index.Regardons les modifications qu’on va prochainement valider. Pour cela, passez la souris au dessus du nom du fichier
README.md
et cliquer dessus. Une page s’ouvre et met en regard la version antérieure avec les ajouts en vert et les suppressions en rouge. Nous retrouverons cette visualisation avec l’interfaceGithub
, plus tard.
Si vous faites la même chose pour scripts/script1.py
, comme le fichier n’existait pas, normalement nous n’avons que
des ajouts.
Il est également possible d’effectuer cela avec la ligne de commande mais c’est
beaucoup moins pratique. Pour cela, la commande à appeler est git diff
et
il est nécessaire d’utiliser l’option cached
pour lui dire d’inspecter les
fichiers pour lesquels on n’a pas encore effectué de commit
. En vert
apparaîtront les modifications et en rouge les suppressions mais, cette fois,
les résultats ne seront pas mis côte-à-côte ce qui est beaucoup moins
pratique.
git diff --cached
2.3 Le commit
A ce stade, nous avons configuré Git
pour être en mesure
de s’authentifier automatiquement et nous avons cloné le dépôt pour avoir une
copie locale de travail. Nous avons fait des modifications, les avons mis dans la file d’attente de notre système de gestion de version. Il ne reste plus qu’à finaliser le travail.
Pour rappel, la Figure 2.3 illustrait la gymnastique pour faire évoluer l’histoire de son projet. Après l’ajout dans la file d’attente (la staging area), on valide les modifications avec un commit. Comme son nom l’indique, il s’agit d’une proposition de modification sur laquelle, en quelques sortes, on s’engage.
Git
.Un commit comporte un titre et éventuellement une description. A ces
informations, Git
ajoutera automatiquement quelques éléments
supplémentaires, notamment l’auteur du commit (pour identifier la personne
ayant proposé cette modification) et l’horodatage (pour identifier le moment
où cette modification a été proposée). Ces informations permettront d’identifier
de manière unique le commit
auquel sera ajouté un identifiant aléatoire
unique (un numéro SHA) qui permettra de faire référence à celui-ci sans
ambiguïté.
Le titre est important car il s’agit, pour un humain, du point d’entrée dans l’histoire d’un dépôt (voir par exemple l’histoire du dépôt du cours. Les titres vagues (Mise à jour du fichier, Update…) sont à bannir car ils nécessiteront un effort inutile pour comprendre les fichiers modifiés.
N’oubliez pas que votre premier collaborateur est votre moi futur qui, dans quelques semaines, ne se souviendra pas en quoi consistait le commit Update du 12 janvier et en quoi il se distingue du Update du 13 mars.
Sur VSCode
, il faut au contraire regarder en haut.
Sur l’interface de Jupyter
Sur Jupyter
, à l’inverse, tout se passe dans la partie inférieure de l’interface graphique.
1️⃣ Entrer le titre Création des premiers scripts 🎉
et ajouter une description
Fichiers dans le dossier script
.
Sur VSCode
, le titre du commit correspond à la
première ligne du message de commit, les lignes suivantes, après un saut de ligne, correspondent à la
description.
2️⃣ Cliquer sur Commit
. Le fichier a disparu de la liste, c’est normal,
il n’a plus de modification à valider. Pour le retrouver dans la liste
des fichiers Changed
, il faudra le modifier à nouveau
3️⃣ Vous devriez voir la ligne de vie de votre projet s’allonger. Vous pouvez cliquer sur le commit pour retrouver les changements que vous avez validé
Si vous utilisiez la ligne de commande, la manière équivalente de faire serait
git commit -m "Initial commit" -m "Création des premiers fichiers 🎉"
L’option m
permet de créer un message, qui sera disponible à l’ensemble
des contributeurs du projet. Avec la ligne de commande, ce n’est pas toujours
très pratique. Les interfaces graphiques permettent des messages plus
développés (la bonne pratique veut qu’on écrive un message de commit comme un
mail succinct : un titre et un peu d’explications, si besoin).
2.4 Le fichier .gitignore
Lorsqu’on utilise Git
, il y a des fichiers qu’on ne veut pas partager
ou dont on ne veut pas suivre les modifications (typiquement les grosses bases de données).
C’est le fichier .gitignore
qui gère les fichiers exclus du contrôle de version.
Lors de la création du projet sur GitHub
, nous avons demandé la création d’un fichier .gitignore
, qui se situe à la racine du projet. Il spécifie l’ensemble des fichiers qui seront toujours exclus de l’indexation faite par Git
.
.gitignore
: fichier stockant un ensemble de règles de fichiers ne devant pas être suivis par Git
.1️⃣ Ouvrir le fichier .gitignore
et observer
quelques règles écrites dedans
Afficher ce fichier quand on utilise Jupyter
Par défaut, le fichier .gitignore
n’est pas affiché car
les fichiers .*
sont des fichiers de configuration. Il faut activer
une option pour l’afficher. Tout en haut
de Jupyter
, cliquer sur View -> Show Hidden Files
2️⃣ Créer un dossier data
à la racine du projet et créer à l’intérieur de celui-ci un fichier data/raw.csv
avec une ligne de données quelconque. Regardez l’onglet Git
et remarquez la présence du fichier dans les changements à valider. Ne pas ajouter à la staging area et committer ce fichier.
3️⃣ Ajouter la ligne data/
dans le .gitignore
(c’est un fichier texte modifiable), n’oubliez pas de sauvegarder. Retourner sur l’onglet Git
et observer le changement. Comprenez-vous ce qu’il se passe ?
4️⃣ Créer un fichier raw2.csv
à la racine et un fichier data/read_data.py
avec une ligne de code Python
(le contenu du fichier n’est pas important).
5️⃣ Retourner sur l’onglet Git
et observer le changement de votre dépôt.
Il ne faut pas négliger le .gitignore
.
Git
est un système de contrôle de version qui est pensé pour des fichiers textes, pas des fichiers de données. Contrairement aux fichiers texte où Git
peut contrôler ligne à ligne les évolutions, ce qui en fait un gestionnaire de version utile, les fichiers de données sont trop complexes pour ce suivi fin, ce qui fait que chaque modification de ces fichiers, souvent lourds (plusieurs Méga Octets), revient à dupliquer le fichier dans la mémoire de Git
(plus de détails sur les alternatives dans Tip 2.1).
Outre cette raison technique qui explique qu’on veuille exclure les fichiers de données du contrôle de version, il ne faut pas oublier que les données exploitées par les data scientists sont souvent confidentielles, collectées pour des finalités bien définies ou ayant un intérêt stratégique qu’une divulgation à des concurrents pourait fragiliser. Partager des données au monde entier peut coûter très cher en vertu du RGPD dont les amendes peuvent aller jusqu’à 4% du chiffre d’affaires mondial.
Ce fichier .gitignore
fait ainsi office de garde-fou. Il est utile d’être conservateur avec celui-ci quitte à autoriser, au cas par cas et de manière consciente, des dérogations. Pour cette raison, il est recommandé d’ajouter de nombreuses extensions classiques de données à celui-ci: *.xlsx
, *.csv
, *.parquet
…
Github
, où les stocker ?
Il est plus pertinent de stocker des données dans des environnements ad hoc. Pour cela, l’état de l’art dans les technologies cloud est d’utiliser un système de stockage spécialisé qui suit un protocole nommé S3
. Ce dernier a été développé à l’origine par Amazon pour son cloud commercial AWS avant d’être rendu open source. Cela permet ainsi d’avoir des infrastructures cloud qui utilisent cette technologie indépendamment d’Amazon.
Github
apparaît certes pratique pour stocker des données. Mais il n’y a pas de free lunch. Ceci a d’abord un coût environnemental : Git
, et donc a fortiori Github
, n’étant pas des systèmes de stockage de bases de données, ils n’optimisent pas le stockage de celles-ci. Il serait bon de ne pas faire croître plus que nécessaire, par du gaspillage numérique, l’empreinte carbone du numérique, déjà en croissance (Arcep 2019). Ensuite, ce choix, à l’origine pratique, s’avère souvent coûteux à long terme. Si la donnée archivée avec Git
évolue fréquemment, la duplication inévitable qu’implique celle-ci fera exploser la volumétrie du dépôt. A partir d’un certain seuil, il faudra basculer vers des solutions complexes comme Git large file storage (LFS)
ce qui est clairement évitable avec de la discipline. Au contraire, avec des systèmes de stockage pensés pour de la donnée, comme le protocole S3
, le stockage et le traitement de celle-ci sont optimisés. C’est ce qui distingue les systèmes de stockage de données comme S3
d’autres systèmes de stockages pensés pour des fichiers, indépendamment de leur format, comme Drive
qui n’est pas adapté aux besoins des data scientists.
Stocker de la donnée est coûteux pour les fournisseurs de cloud et il n’est pas étonnant que ces derniers proposent rarement des offres gratuites de volumes importants. Les utilisateurs.trices du SSPCloud
bénéficient d’un système de stockage associé à la plateforme et suivant le protocole S3. Plus d’éléments dans le chapitre consacré et dans le cours de 3e année de l’ENSAE de Mise en production de projets data science.
3 Premières interactions avec Github
depuis sa copie de travail
Jusqu’à présent, après avoir cloné le dépôt, on a travaillé uniquement
sur notre copie locale. On n’a pas cherché à interagir à nouveau
avec Github
.
Il est tout à fait possible de faire du contrôle de version sans mettre en place de dépôt distant. Cependant,
- c’est dangereux puisque le dépôt distant fait office de sauvegarde d’un projet. Sans dépôt distant, on peut tout perdre en cas de problème sur la copie locale de travail ;
- c’est désirer être moins efficace car, comme nous allons le montrer, les
fonctionalités des plateformes
Github
etGitlab
sont également très bénéfiques lorsqu’on travaille tout seul.
Interagir avec le dépôt distant consiste à récupérer les nouveautés sur celui-ci ou envoyer nos dernières modifications vers ce dépôt centralisateur. En pratique, on peut donc résumer 95% de la pratique quotidienne de Git
en trois mots:
commit
: je valide les modifications que j’ai faites en local avec un message qui les expliquepull
: je récupère la dernière version des codes du dépôt distant (opération ditefetch
) et je la fusionne avec mes changements, si j’en ai fait (opération ditemerge
)push
: je transmets mes modifications validées au dépôt distant
Nous avons déjà vu le premier, nous allons voir maintenant les deux nouveaux termes.
Avant cela, on peut revenir sur une commande déjà évoquée git remote -v
. Le dépôt distant s’appelle remote
en langage Git. L’option -v
(verbose)
permet de lister le(s) dépôt(s) distant(s).
En ouvrant un terminal dans VSCode
, en tapant git remote -v
dans celui-ci, vous devriez avoir un résultat similaire à celui-ci:
origin https://<PAT>@github.com/<username>/<projectname>.git (fetch)
origin https://<PAT>@github.com/<username>/<projectname>.git (push)
Plusieurs informations sont intéressantes dans ce résultat. D’abord on
retrouve bien l’url qu’on avait renseigné à Git
lors de l’opération
de clonage. Ensuite, on remarque un terme origin
. C’est un alias
pour l’url qui suit. Cela évite d’avoir, à chaque fois, à taper l’ensemble
de l’url, ce qui peut être pénible et source d’erreur.
fetch
et push
sont là pour nous indiquer qu’on récupère (fetch
) des modifications
d’origin
mais qu’on envoie également (push
) des modifications vers
celui-ci. Généralement, les url de ces deux dépôts sont les mêmes mais cela peut
arriver, lorsqu’on contribue à des projets opensource qu’on n’a pas créé,
qu’ils diffèrent. Ceci sera expliqué dans le prochain chapitre lorsque nous aborderons le sujet de la collaboration.
3.1 Envoyer des modifications sur le dépôt distant (push
)
Il convient maintenant d’envoyer les fichiers sur le dépôt distant.
1️⃣ Si vous ne l’avez pas déjà fait, ajouter la règle *.csv
dans votre .gitignore
. Avec l’interface graphique, ajouter tous les fichiers en attente dans l’index (git add
) et faites un commit (git commit
).
2️⃣ Cliquer sur le bouton Sync changes
L’équivalent de ces deux questions serait, en ligne de commande:
- Cela signifie: “git envoie (
push
) mes modifications sur la branchemain
(la branche sur laquelle on a travaillé, on reviendra dessus) vers mon dépôt (aliasorigin
)”
3.2 Récupérer des modifications depuis le dépôt distant (pull
)
La deuxième manière d’interagir avec le dépôt est de récupérer des
résultats disponibles en ligne sur sa copie de travail. On appelle
cela pull
.
Pour le moment, vous êtes tout seul sur le dépôt. Il n’y a donc pas de
partenaire pour modifier un fichier dans le dépôt distant. On va simuler ce
cas en utilisant l’interface graphique de Github
pour modifier
des fichiers. On rapatriera les résultats en local dans un deuxième temps.
1️⃣ Se rendre sur votre dépôt depuis l’interface https://github.com
- Se placer sur le fichier
README.md
et cliquer sur le boutonEdit this file
, qui prend la forme d’un icône de crayon.
2️⃣ Changer le titre du README.md
. Sautez une ligne à la fin de votre fichier et entrez le texte que vous désirez, sans ponctuation. Par exemple,
le chêne un jour dit au roseau
3️⃣ Cliquez sur l’onglet Preview
pour voir le texte mis en forme au format Markdown
4️⃣ Rédiger un titre et un message complémentaire pour faire le commit
. Conserver
l’option par défaut Commit directly to the main branch
5️⃣ Editer à nouveau le README
en cliquant sur le crayon juste au dessus
de l’affichage du contenu du README
.
Ajouter une deuxième phrase et corrigez la ponctuation de la première. Ecrire un message de commit et valider.
Le Chêne un jour dit au roseau :
Vous avez bien sujet d'accuser la Nature
6️⃣ Au dessus de l’aborescence des fichiers, vous devriez voir s’afficher le titre du dernier commit. Vous pouvez cliquer dessus pour voir la modification que vous avez faite.
7️⃣ Les résultats sont sur le dépôt distant mais ne sont pas sur votre
dossier de travail dans Jupyter
ou VSCode
. Il faut re-synchroniser votre copie locale
avec le dépôt distant :
- Sur
VSCode
, cliquez simplement sur... > Pull
à côté du bouton qui permet de visualiser le graphe Git. - Avec l’interface
Jupyter
, si cela est possible, appuyez tout simplement sur la petite flèche vers le bas, qui est celle qui a désormais la pastille orange. - Si cette flèche n’est pas disponible ou si vous travaillez dans un autre environnement, vous pouvez utiliser la ligne de commande et taper
- Cela signifie : “git récupère (
pull
) les modifications sur la branchemain
vers mon dépôt (aliasorigin
)”
8️⃣ Regarder à nouveau l’historique des commits. Cliquez sur le
dernier commit et affichez les changements sur le fichier. Vous pouvez
remarquer la finesse du contrôle de version : Git
détecte au sein de
la première ligne de votre texte que vous avez mis des majuscules
ou de la ponctuation.
L’opération pull
permet :
- A votre système local de vérifier les modifications sur le dépôt distant
que vous n’auriez pas faites (cette opération s’appelle
fetch
) - De les fusionner s’il n’y a pas de conflit de version ou si les conflits de version sont automatiquement fusionnables (deux modifications d’un fichier mais qui ne portent pas sur le même emplacement).
4 Les branches
Jusqu’à présent, nous avons fait évoluer de manière linéaire notre historique, sans prendre de risque. Ceci est déjà très sécurisant puisqu’on peut toujours retrouver l’état passé d’un code. Mais comment faire quand on désire faire des évolutions conséquentes, impliquant plusieurs étapes intermédiaires ayant vocation à être chacune un commit, sans risque de déstabiliser notre version dont on était, jusqu’à présent, satisfait.
Git
propose un système extrêmement pratique pour cela: les branches. Une branche est une version parallèle du projet qui coexiste avec la version principale, sur main
. Cela veut dire qu’avec Git
, on peut avoir un même fichier qui coexiste sous plusieurs versions différentes ce qui constitue un terreau fertile pour l’expérimentation. Une version sera active (la branche active) mais les autres seront disponibles, activables si besoin.
On peut voir l’historique de Git
comme un arbre raffiné. La branche main
est le tronc. Les autres branches partent de ce tronc et divergent. Le tronc peut très bien évoluer en parallèle de ces branches. L’arbre de Git
est néanmoins spécial, quelques peu noueux : les branches peuvent revenir et fusionner avec le tronc. Nous verrons cela de manière plus illustrée dans le prochain exercice et dans le prochain chapitre puisque c’est l’une des bases du travail collaboratif avec Git
.
Voici quelques exemples où les branches sont utilisées pour des travaux significatifs :
- vous travaillez seul sur une tâche qui va vous prendre plusieurs heures ou jours de travail (vous ne devez pas pousser sur
main
des travaux non aboutis); - vous travaillez sur une fonctionnalité nouvelle et vous souhaiterez recueillir l’avis de vos collaborateurs avant de modifier
main
; - vous n’êtes pas certain de réussir vos modifications du premier coup et préférez faire des tests en parallèle.
Il est commun, dans un cadre collaboratif, d’utiliser à foison les branches. Comme nous le verrons dans le prochain chapitre, cela peut en effet faire économiser un temps précieux si l’organisation du projet est mal définie. Néanmoins, les branches ne sont pas un remède magique car leur gestion demande de la rigueur et peut entraîner de la désorganisation sans celle-ci. Git
est une solution technique qui fluidifie l’organisation mais en cas de rôles mal définis, il va rapidement vous révéler les problèmes, mais ne vous offrira pas la solution sans un effort de réflexion sur l’organisation du travail.
Les branches ne sont pas personnelles, ce n’est pas parce que vous avez créé une branche qu’une des personnes collaborant avec vous sur le projet Git
ne pourra pas modifier cette branche.
L’utilisation des branches est une fonctionnalité déjà avancée de Git
. Ce dernier est un outil technique formidable mais ne résout pas les problèmes organisationnels. Au contraire, avec Git
, ils se révèleront beaucoup plus vite. Git
est vraiment le socle minimal des bonnes pratiques, un outil qui va inciter à toujours mieux travailler.
Parmi les pratiques techniquement possibles mais non recommandables, il faut absolument bannir les usages de push force
qui peuvent déstabiliser les copies locales des collaborateurs. S’il est nécessaire de faire un push force
, c’est qu’il y a un problème dans la branche, à identifier et régler sans faire push force
.
Les branches sont généralement associées au système des issues sur Github
. Les issues ne sont pas des fonctionnalités natives de Git
mais apportées par Github
qui vise à simplifier le suivi d’un projet et les retours des autres collaborateurs.trices ou utilisateurs.trices d’un projet.
On peut voir les issues comme un système de discussion où peuvent échanger les personnes intéressées par le projet. L’intérêt d’utiliser ceci par le biais de Github
plutôt qu’une boucle de mail et que cela permet de centraliser au même endroit que le code les échanges et la documentation utiles à son évolution. La finalité des issues est très large: cela peut être pour discuter de nouvelles fonctionnalités qui finalement ne seront pas mises en oeuvre, signaler des bugs, se répartir le travail, etc. Une utilisation intensive des issues, avec des labels adéquats, peut même amener à se passer d’outils de gestion de projets comme Trello
.
Le prochain exercice vise à illustrer le principe des branches en inventant un exemple de demande passant par une issue et proposant une nouvelle fonctionnalité dans le projet.
1️⃣ Ouvrir une issue sur Github
(cf. explications ci-dessus sur le principe des issues). Signaler qu’il serait bien d’ajouter un emoji chat dans le README
. Dans la partie de droite, cliquer sur la petite roue à côté de Label
et cliquer sur Edit Labels
. Créer un label Markdown
. Normalement, le label a été ajouté.
2️⃣ Retournez sur votre dépôt local. Vous allez créer une branche nommée
issue-1
Comment faire dans VSCode
?
Sur VSCode, cliquez sur VSCode
?... > Branch > Create Branch
et entrez le nom issue-1
.
Comment faire dans Jupyter
?
Jupyter
?Avec l’interface graphique de JupyterLab
, cliquez sur Current Branch - Main
puis sur le bouton New Branch
. Rentrez issue-1
comme nom de branche
(la branche doit être créée depuis main
, ce qui est normalement le choix
par défaut) et cliquez sur Create Branch
.
Comment faire en ligne de commande ?
Si vous n’utilisez pas l’interface graphique mais la ligne de commande, la manière équivalente de faire est
- La commande
checkout
est un couteau-suisse de la gestion de branche enGit
. Elle permet en effet de basculer d’une branche à l’autre, mais aussi d’en créer, etc.
3️⃣ Ouvrez README.md
et ajoutez un emoji chat (🐱) à la suite du titre.
Faites un commit en refaisant les étapes vues dans les exercices
précédents. N’oubliez pas, cela se fait en deux étapes:
- Ajoute les modifications à l’index en déplacant le fichier
README
dans la partieStaged
- Validation des modifications avec un
commit
Si vous passez par la ligne de commande, cela donnera :
git add .
git commit -m "ajout emoji chat"
4️⃣ Faire un deuxième commit pour ajouter un emoji koala (:koala:) puis
pousser les modifications locales:
+ Sur VSCode
, cliquez sur le bouton Publish Branch
.
+ Sinon, si vous utilisez la ligne de commande, vous devrez taper git push origin issue-1
5️⃣ Dans Github
, devrait apparaître
issue-1 had recent pushes XX minutes ago
.
Cliquer sur Compare & Pull Request
. Donner un titre informatif à votre pull request
Dans le message en dessous, taper
- close #1
Le tiret est une petite astuce pour que Github
remplace le numéro de l’issue par le titre.
Cliquez sur Create Pull Request
mais
ne validez pas la fusion, on le fera dans un second temps.
Le fait d’avoir mis un message close
suivi d’un numéro d’issue #1
permettra de fermer automatiquement l’issue 1 lorsque vous ferez le merge.
En attendant, vous avez créé un lien entre l’issue et la pull request
Au passage, vous pouvez ajouter le label Markdown
sur la droite.
6️⃣ En local, retourner sur main
. Dans l’interface Jupyter
, il suffit
de cliquer sur main
dans la liste des branches. Sur VSCode
, la liste des branches
apparaît en cliquant sur le nom de la branche actuelle (issue-1
en théorie à ce stade).
Si vous êtes en ligne de commande, il faut faire
git checkout main
checkout
est une commande Git
qui permet de naviguer d’une branche à l’autre
(voire d’un commit à l’autre).
Ajouter une phrase à la suite de votre texte dans le README.md
(ne touchez pas au titre !). Vous pouvez remarquer que les emojis
ne sont pas dans le titre, c’est normal vous n’avez pas encore fusionné les versions
7️⃣ Faire un commit et un push. En ligne de commande, cela donne
git add .
git commit -m "ajoute un troisième vers"
git push origin main
8️⃣ Sur Github
, cliquer sur Insights
en haut du dépôt puis, à gauche sur Network
(cela n’est
possible que si vous avez rendu public votre dépôt).
Vous devriez voir apparaître l’arborescence de votre dépôt. On peut voir issue-1
comme une ramification et main
comme le tronc.
L’objectif est maintenant de ramener les modifications faites dans issue-1
dans la branche principale. Retournez dans l’onglet Pull Requests
. Là, changer le type de merge
pour Squash and Merge
, comme ci-dessous (petit conseil : choisissez toujours cette méthode de merge).
Une fois que cela est fait, vous pouvez retourner dans Insights
puis Network
pour vérifier que tout s’est bien passé comme prévu.
9️⃣ Supprimer la branche (branch > delete this branch). Puisqu’elle est mergée, elle ne servira plus. La conserver risque d’amener à des push
involontaires dessus.
L’option de fusion Squash and Merge permet de regrouper tous les commits d’une branche (potentiellement très nombreux) en un seul dans la branche de destination. Cela évite, sur les gros projets, des branches avec des milliers de commits.
Je recommande de toujours utiliser cette technique et non les autres.
Pour désactiver les autres techniques, vous pouvez aller dans
Settings
et dans la partie Merge button
ne conserver cochée que la
méthode Allow squash merging
Nous avons toutes les bases nécessaires pour passer à l’étape suivante dans notre périple Git
: le travail collaboratif. Néanmoins, Git
ne doit pas être utilisé que dans des projets collectifs. Même tout seul, les gains de qualité à l’utilisation de Git
sont sans équivalents.
Informations additionnelles
environment files have been tested on.
Latest built version: 2024-11-20
Python version used:
'3.12.6 | packaged by conda-forge | (main, Sep 30 2024, 18:08:52) [GCC 13.3.0]'
Package | Version |
---|---|
affine | 2.4.0 |
aiobotocore | 2.15.1 |
aiohappyeyeballs | 2.4.3 |
aiohttp | 3.10.8 |
aioitertools | 0.12.0 |
aiosignal | 1.3.1 |
alembic | 1.13.3 |
altair | 5.4.1 |
aniso8601 | 9.0.1 |
annotated-types | 0.7.0 |
appdirs | 1.4.4 |
archspec | 0.2.3 |
asttokens | 2.4.1 |
attrs | 24.2.0 |
babel | 2.16.0 |
bcrypt | 4.2.0 |
beautifulsoup4 | 4.12.3 |
black | 24.8.0 |
blinker | 1.8.2 |
blis | 0.7.11 |
bokeh | 3.5.2 |
boltons | 24.0.0 |
boto3 | 1.35.23 |
botocore | 1.35.23 |
branca | 0.7.2 |
Brotli | 1.1.0 |
cachetools | 5.5.0 |
cartiflette | 0.0.2 |
Cartopy | 0.24.1 |
catalogue | 2.0.10 |
cattrs | 24.1.2 |
certifi | 2024.8.30 |
cffi | 1.17.1 |
charset-normalizer | 3.3.2 |
click | 8.1.7 |
click-plugins | 1.1.1 |
cligj | 0.7.2 |
cloudpathlib | 0.20.0 |
cloudpickle | 3.0.0 |
colorama | 0.4.6 |
comm | 0.2.2 |
commonmark | 0.9.1 |
conda | 24.9.1 |
conda-libmamba-solver | 24.7.0 |
conda-package-handling | 2.3.0 |
conda_package_streaming | 0.10.0 |
confection | 0.1.5 |
contextily | 1.6.2 |
contourpy | 1.3.0 |
cryptography | 43.0.1 |
cycler | 0.12.1 |
cymem | 2.0.8 |
cytoolz | 1.0.0 |
dask | 2024.9.1 |
dask-expr | 1.1.15 |
databricks-sdk | 0.33.0 |
debugpy | 1.8.6 |
decorator | 5.1.1 |
Deprecated | 1.2.14 |
diskcache | 5.6.3 |
distributed | 2024.9.1 |
distro | 1.9.0 |
docker | 7.1.0 |
duckdb | 0.10.1 |
en-core-web-sm | 3.7.1 |
entrypoints | 0.4 |
et_xmlfile | 2.0.0 |
exceptiongroup | 1.2.2 |
executing | 2.1.0 |
fastexcel | 0.11.6 |
fastjsonschema | 2.20.0 |
fiona | 1.10.1 |
Flask | 3.0.3 |
folium | 0.17.0 |
fontawesomefree | 6.6.0 |
fonttools | 4.54.1 |
frozendict | 2.4.4 |
frozenlist | 1.4.1 |
fsspec | 2023.12.2 |
funcy | 2.0 |
gensim | 4.3.2 |
geographiclib | 2.0 |
geopandas | 1.0.1 |
geoplot | 0.5.1 |
geopy | 2.4.1 |
gitdb | 4.0.11 |
GitPython | 3.1.43 |
google-auth | 2.35.0 |
graphene | 3.3 |
graphql-core | 3.2.4 |
graphql-relay | 3.2.0 |
graphviz | 0.20.3 |
great-tables | 0.12.0 |
greenlet | 3.1.1 |
gunicorn | 22.0.0 |
h2 | 4.1.0 |
hpack | 4.0.0 |
htmltools | 0.6.0 |
hyperframe | 6.0.1 |
idna | 3.10 |
imageio | 2.36.0 |
importlib_metadata | 8.5.0 |
importlib_resources | 6.4.5 |
inflate64 | 1.0.0 |
ipykernel | 6.29.5 |
ipython | 8.28.0 |
itsdangerous | 2.2.0 |
jedi | 0.19.1 |
Jinja2 | 3.1.4 |
jmespath | 1.0.1 |
joblib | 1.4.2 |
jsonpatch | 1.33 |
jsonpointer | 3.0.0 |
jsonschema | 4.23.0 |
jsonschema-specifications | 2024.10.1 |
jupyter-cache | 1.0.0 |
jupyter_client | 8.6.3 |
jupyter_core | 5.7.2 |
kaleido | 0.2.1 |
kiwisolver | 1.4.7 |
langcodes | 3.5.0 |
language_data | 1.3.0 |
lazy_loader | 0.4 |
libmambapy | 1.5.9 |
locket | 1.0.0 |
lxml | 5.3.0 |
lz4 | 4.3.3 |
Mako | 1.3.5 |
mamba | 1.5.9 |
mapclassify | 2.8.1 |
marisa-trie | 1.2.1 |
Markdown | 3.6 |
markdown-it-py | 3.0.0 |
MarkupSafe | 2.1.5 |
matplotlib | 3.9.2 |
matplotlib-inline | 0.1.7 |
mdurl | 0.1.2 |
menuinst | 2.1.2 |
mercantile | 1.2.1 |
mizani | 0.11.4 |
mlflow | 2.16.2 |
mlflow-skinny | 2.16.2 |
msgpack | 1.1.0 |
multidict | 6.1.0 |
multivolumefile | 0.2.3 |
munkres | 1.1.4 |
murmurhash | 1.0.10 |
mypy-extensions | 1.0.0 |
narwhals | 1.14.1 |
nbclient | 0.10.0 |
nbformat | 5.10.4 |
nest_asyncio | 1.6.0 |
networkx | 3.3 |
nltk | 3.9.1 |
numexpr | 2.10.1 |
numpy | 1.26.4 |
opencv-python-headless | 4.10.0.84 |
openpyxl | 3.1.5 |
opentelemetry-api | 1.16.0 |
opentelemetry-sdk | 1.16.0 |
opentelemetry-semantic-conventions | 0.37b0 |
OWSLib | 0.28.1 |
packaging | 24.1 |
pandas | 2.2.3 |
paramiko | 3.5.0 |
parso | 0.8.4 |
partd | 1.4.2 |
pathspec | 0.12.1 |
patsy | 0.5.6 |
Pebble | 5.0.7 |
pexpect | 4.9.0 |
pickleshare | 0.7.5 |
pillow | 10.4.0 |
pip | 24.2 |
platformdirs | 4.3.6 |
plotly | 5.24.1 |
plotnine | 0.13.6 |
pluggy | 1.5.0 |
polars | 1.8.2 |
preshed | 3.0.9 |
prometheus_client | 0.21.0 |
prometheus_flask_exporter | 0.23.1 |
prompt_toolkit | 3.0.48 |
protobuf | 4.25.3 |
psutil | 6.0.0 |
ptyprocess | 0.7.0 |
pure_eval | 0.2.3 |
py7zr | 0.20.8 |
pyarrow | 17.0.0 |
pyarrow-hotfix | 0.6 |
pyasn1 | 0.6.1 |
pyasn1_modules | 0.4.1 |
pybcj | 1.0.2 |
pycosat | 0.6.6 |
pycparser | 2.22 |
pycryptodomex | 3.21.0 |
pydantic | 2.9.2 |
pydantic_core | 2.23.4 |
Pygments | 2.18.0 |
pyLDAvis | 3.4.1 |
PyNaCl | 1.5.0 |
pynsee | 0.1.8 |
pyogrio | 0.10.0 |
pyOpenSSL | 24.2.1 |
pyparsing | 3.1.4 |
pyppmd | 1.1.0 |
pyproj | 3.7.0 |
pyshp | 2.3.1 |
PySocks | 1.7.1 |
python-dateutil | 2.9.0 |
python-dotenv | 1.0.1 |
python-magic | 0.4.27 |
pytz | 2024.1 |
pyu2f | 0.1.5 |
pywaffle | 1.1.1 |
PyYAML | 6.0.2 |
pyzmq | 26.2.0 |
pyzstd | 0.16.2 |
querystring_parser | 1.2.4 |
rasterio | 1.4.2 |
referencing | 0.35.1 |
regex | 2024.9.11 |
requests | 2.32.3 |
requests-cache | 1.2.1 |
retrying | 1.3.4 |
rich | 13.9.4 |
rpds-py | 0.21.0 |
rsa | 4.9 |
ruamel.yaml | 0.18.6 |
ruamel.yaml.clib | 0.2.8 |
s3fs | 2023.12.2 |
s3transfer | 0.10.2 |
scikit-image | 0.24.0 |
scikit-learn | 1.5.2 |
scipy | 1.13.0 |
seaborn | 0.13.2 |
setuptools | 74.1.2 |
shapely | 2.0.6 |
shellingham | 1.5.4 |
six | 1.16.0 |
smart-open | 7.0.5 |
smmap | 5.0.0 |
sortedcontainers | 2.4.0 |
soupsieve | 2.5 |
spacy | 3.7.5 |
spacy-legacy | 3.0.12 |
spacy-loggers | 1.0.5 |
SQLAlchemy | 2.0.35 |
sqlparse | 0.5.1 |
srsly | 2.4.8 |
stack-data | 0.6.2 |
statsmodels | 0.14.4 |
tabulate | 0.9.0 |
tblib | 3.0.0 |
tenacity | 9.0.0 |
texttable | 1.7.0 |
thinc | 8.2.5 |
threadpoolctl | 3.5.0 |
tifffile | 2024.9.20 |
toolz | 1.0.0 |
topojson | 1.9 |
tornado | 6.4.1 |
tqdm | 4.66.5 |
traitlets | 5.14.3 |
truststore | 0.9.2 |
typer | 0.13.1 |
typing_extensions | 4.12.2 |
tzdata | 2024.2 |
Unidecode | 1.3.8 |
url-normalize | 1.4.3 |
urllib3 | 1.26.20 |
wasabi | 1.1.3 |
wcwidth | 0.2.13 |
weasel | 0.4.1 |
webdriver-manager | 4.0.2 |
websocket-client | 1.8.0 |
Werkzeug | 3.0.4 |
wheel | 0.44.0 |
wordcloud | 1.9.3 |
wrapt | 1.16.0 |
xgboost | 2.1.1 |
xlrd | 2.0.1 |
xyzservices | 2024.9.0 |
yarl | 1.13.1 |
yellowbrick | 1.5 |
zict | 3.0.0 |
zipp | 3.20.2 |
zstandard | 0.23.0 |
View file history
SHA | Date | Author | Description |
---|---|---|---|
1202a02 | 2024-10-22 11:25:10 | Lino Galiana | Git, modifs suite au cours de 2024 (#568) |
6ff0f63 | 2024-10-22 06:54:44 | lgaliana | Numéro exo |
3a3b18a | 2024-10-22 06:52:52 | lgaliana | Emoji chat pour de vrai |
20672a4 | 2024-10-11 13:11:20 | Lino Galiana | Quelques correctifs supplémentaires sur Git et mercator (#566) |
c326488 | 2024-10-10 14:31:57 | Romain Avouac | Various fixes (#565) |
be1dd6e | 2024-10-01 13:49:35 | Lino Galiana | Solve problem with english badges + few bug solved (#560) |
21db4db | 2024-09-30 11:42:26 | lgaliana | Marges |
3e04253 | 2024-09-30 10:11:32 | Lino Galiana | Grosse mise à jour de la partie Git (#557) |
580cba7 | 2024-08-07 18:59:35 | Lino Galiana | Multilingual version as quarto profile (#533) |
c9f9f8a | 2024-04-24 15:09:35 | Lino Galiana | Dark mode and CSS improvements (#494) |
005d89b | 2023-12-20 17:23:04 | Lino Galiana | Finalise l’affichage des statistiques Git (#478) |
4c1c22d | 2023-12-10 11:50:56 | Lino Galiana | Badge en javascript plutôt (#469) |
09654c7 | 2023-11-14 15:16:44 | Antoine Palazzolo | Suggestions Git & Visualisation (#449) |
e3f1ef1 | 2023-11-13 11:53:50 | Thomas Faria | Relecture git (#448) |
1229936 | 2023-11-10 11:02:28 | linogaliana | gitignore |
57f108f | 2023-11-10 10:59:36 | linogaliana | Intro git |
9366e8d | 2023-10-09 12:06:23 | Lino Galiana | Retrait des box hugo sur l’exo git (#428) |
a771183 | 2023-10-09 11:27:45 | Antoine Palazzolo | Relecture TD2 par Antoine (#418) |
5ab34aa | 2023-10-04 14:54:20 | Kim A | Relecture Kim pandas & git (#416) |
154f09e | 2023-09-26 14:59:11 | Antoine Palazzolo | Des typos corrigées par Antoine (#411) |
3bdf3b0 | 2023-08-25 11:23:02 | Lino Galiana | Simplification de la structure 🤓 (#393) |
30823c4 | 2023-08-24 14:30:55 | Lino Galiana | Liens morts navbar (#392) |
2dbf853 | 2023-07-05 11:21:40 | Lino Galiana | Add nice featured images (#368) |
34cc32c | 2022-10-14 22:05:47 | Lino Galiana | Relecture Git (#300) |
f394b23 | 2022-10-13 14:32:05 | Lino Galiana | Dernieres modifs geopandas (#298) |
f10815b | 2022-08-25 16:00:03 | Lino Galiana | Notebooks should now look more beautiful (#260) |
12965ba | 2022-05-25 15:53:27 | Lino Galiana | :launch: Bascule vers quarto (#226) |
9c71d6e | 2022-03-08 10:34:26 | Lino Galiana | Plus d’éléments sur S3 (#218) |
0e01c33 | 2021-11-10 12:09:22 | Lino Galiana | Relecture (antuki?) API+Webscraping + Git (#178) |
f95b174 | 2021-11-03 12:08:34 | Lino Galiana | Enrichi la section sur la gestion des dépendances (#175) |
9a3f7ad | 2021-10-31 18:36:25 | Lino Galiana | Nettoyage partie API + Git (#170) |
2f4d390 | 2021-09-02 15:12:29 | Lino Galiana | Utilise un shortcode github (#131) |
4cdb759 | 2021-05-12 10:37:23 | Lino Galiana | :sparkles: :star2: Nouveau thème hugo :snake: :fire: (#105) |
7f9f97b | 2021-04-30 21:44:04 | Lino Galiana | 🐳 + 🐍 New workflow (docker 🐳) and new dataset for modelization (2020 🇺🇸 elections) (#99) |
283e8e9 | 2020-10-02 18:54:30 | Lino Galiana | Première partie des exos git (#61) |
Les références
Notes de bas de page
Pour savoir si vous êtes éligibles au SSPCloud, vous pouvez cliquer sur ce lien et consulter la liste des domaines autorisés.↩︎
Plus précisément,
Git
est un système décentralisé et asynchrone de contrôle de version. Cela signifie qu’outre le fait qu’on édite ses fichiers sur des copies locales, on n’a pas besoin d’être connecté en continu au dépôt distant. On peut faire les modifications et les soumettre plus tard.↩︎La documentation collaborative
utilitR
présente les raisons pour lesquelles il convient de favoriser la méthode HTTPS sur la méthode SSH.↩︎Comme vous pouvez le voir, il y a de nombreux niveaux de droits différents. Votre mot de passe a en fait tout ces droits, ce qui illustre bien le pouvoir dangereux de celui-ci s’il est découvert, que ce soit du fait d’une révélation par erreur ou d’un hacking de celui-ci par quelqu’un malveillant. L’utilisation de token sécurise énormément votre dépôt puisqu’il ne peut pas être supprimé si le token a des droits limités. De plus, si la branche principale est protégée, ce qui est le comportement par défaut de
Github
, il ne sera pas possible sans mot de passe de détruire l’historique du dépôt.↩︎
Citation
@book{galiana2023,
author = {Galiana, Lino},
title = {Python pour la data science},
date = {2023},
url = {https://pythonds.linogaliana.fr/},
doi = {10.5281/zenodo.8229676},
langid = {fr}
}