Python >> Tutoriel Python >  >> Python

Premiers pas avec GitPython

GitPython est une bibliothèque de code Python pour lire et écrire par programmation dans les référentiels de contrôle Gitsource.

Apprenons à utiliser GitPython en l'installant rapidement et en lisant à partir d'un référentiel Git cloné local.

Nos outils

Ce tutoriel devrait fonctionner avec Python 2.7 ou 3, mais Python 3, en particulier 3.6+, est fortement recommandé pour toutes les nouvelles applications. J'ai utilisé Python 3.6.3 pour écrire ce post. En plus de Python, tout au long de ce didacticiel, nous utiliserons également les dépendances d'application suivantes :

  • Git,une implémentation de contrôle de source (version),version 2.15.1
  • GitPythonversion 2.1.7
  • pip et virtualenv, qui sont fournis avec Python 3, pour installer et isoler la bibliothèque GitPython de n'importe lequel de vos autres projets Python

Consultez ce guide pour configurer Python 3 et Flask sur Ubuntu 16.04 LTS si vous avez besoin d'instructions spécifiques pour configurer un environnement de développement Python de base.

Tout le code de cet article de blog est disponible en open source sous licence MIT sur GitHub sous le répertoire first-steps-gitpython du référentiel blog-code-examples. Utilisez et abusez du code source comme vous le souhaitez pour vos propres applications.

Installer GitPython

Commencez par créer un nouvel environnement virtuel pour votre projet. Mon virtualenvis nommé testgit mais vous pouvez nommer le vôtre en fonction du projet que vous créez.

python3 -m venv gitpy

Activez le virtualenv nouvellement créé.

source gitpy/bin/activate

Le nom de l'environnement virtuel sera ajouté à l'invite de commande après l'activation.

Maintenant que le virutalenv est activé, nous pouvons utiliser le pip commande pour installer GitPython.

pip install gitpython==2.1.7

Exécutez le pip commande et une fois que tout est installé, vous devriez voir une sortie similaire au message suivant "Installé avec succès".

(gitpy) $ pip install gitpython==2.1.7
Collecting gitpython==2.1.7
  Downloading GitPython-2.1.7-py2.py3-none-any.whl (446kB)
    100% |████████████████████████████████| 450kB 651kB/s 
Collecting gitdb2>=2.0.0 (from gitpython==2.1.7)
  Downloading gitdb2-2.0.3-py2.py3-none-any.whl (63kB)
    100% |████████████████████████████████| 71kB 947kB/s 
Collecting smmap2>=2.0.0 (from gitdb2>=2.0.0->gitpython==2.1.7)
  Downloading smmap2-2.0.3-py2.py3-none-any.whl
Installing collected packages: smmap2, gitdb2, gitpython
Successfully installed gitdb2-2.0.3 gitpython-2.1.7 smmap2-2.0.3

Ensuite, nous pouvons commencer à interagir par programmation avec les référentiels Git dans nos applications Python avec GitPython installé.

Cloner le référentiel

GitPython peut fonctionner avec des référentiels distants, mais pour plus de simplicité, dans ce didacticiel, nous utiliserons un référentiel cloné sur notre système local.

Clonez un référentiel avec lequel vous souhaitez travailler sur votre système local. Si vous n'en avez pas en tête, utilisez le référentiel Open Source Full Stack Python Git hébergé sur GitHub.

git clone [email protected]:mattmakai/fullstackpython.com fsp

Prenez note de l'emplacement où vous avez cloné le référentiel car nous avons besoin du chemin pour indiquer à GitPython quel référentiel gérer. Passez dans le répertoire du nouveau dépôt Git avec cd puis exécutez le pwd (répertoire de travail actuel) pour obtenir le chemin complet.

cd fsp
pwd

Vous verrez une sortie comme /Users/matt/devel/py/fsp . Ce chemin est votre chemin absolu vers la base du référentiel Git.

Utilisez le export commande pour définir une variable d'environnement pour le chemin absolu vers le référentiel Git.

export GIT_REPO_PATH='/Users/matt/devel/py/fsp' # make sure this your own path

Notre référentiel Git et la variable d'environnement de chemin sont tous définis, écrivons donc le code Python qui utilise GitPython.

Lire le référentiel et valider les données

Créez un nouveau fichier Python nommé read_repo.py et ouvrez-le pour que nous puissions commencer à coder un script simple.

Commencez par quelques importations et une constante :

import os
from git import Repo


COMMITS_TO_PRINT = 5

Le os module facilite la lecture des variables d'environnement, telles que notre GIT_REPO_PATH variable que nous avons définie précédemment. from git import Repo donne à notre application l'accès à la bibliothèque GitPython lorsque nous créons le Repo objet.COMMITS_TO_PRINT est une constante qui limite le nombre de lignes de sortie en fonction du nombre de commits sur lesquels nous voulons que notre script imprime des informations. Full Stack Python a plus de 2 250 commits, il y aurait donc beaucoup de sortie si nous imprimions chaque commit.

Suivant dans notre read_repo.py fichier créer une fonction pour imprimer des informations de validation individuelles :

def print_commit(commit):
    print('----')
    print(str(commit.hexsha))
    print("\"{}\" by {} ({})".format(commit.summary,
                                     commit.author.name,
                                     commit.author.email))
    print(str(commit.authored_datetime))
    print(str("count: {} and size: {}".format(commit.count(),
                                              commit.size)))

Le print_commit La fonction prend un objet de commit GitPython et imprime le hachage SHA-1 de 40 caractères pour le commit suivi de :

  1. le résumé du commit
  2. nom de l'auteur
  3. adresse e-mail de l'auteur
  4. date et heure du commit
  5. compter et mettre à jour la taille

Sous le print_commit fonction, créez une autre fonction nommée print_repository pour imprimer les détails du Repo objet :

def print_repository(repo):
    print('Repo description: {}'.format(repo.description))
    print('Repo active branch is {}'.format(repo.active_branch))
    for remote in repo.remotes:
        print('Remote named "{}" with URL "{}"'.format(remote, remote.url))
    print('Last commit for repo is {}.'.format(str(repo.head.commit.hexsha)))

print_repository est similaire à print_commit mais imprime à la place la description du référentiel, la branche active, toutes les URL Git distantes configurées pour ce référentiel et le dernier commit.

Enfin, nous avons besoin d'une fonction "main" lorsque nous invoquons le script depuis le terminal en utilisant le python commande. Complétez notre

if __name__ == "__main__":
    repo_path = os.getenv('GIT_REPO_PATH')
    # Repo object used to programmatically interact with Git repositories
    repo = Repo(repo_path)
    # check that the repository loaded correctly
    if not repo.bare:
        print('Repo at {} successfully loaded.'.format(repo_path))
        print_repository(repo)
        # create list of commits then print some of them to stdout
        commits = list(repo.iter_commits('master'))[:COMMITS_TO_PRINT]
        for commit in commits:
            print_commit(commit)
            pass
    else:
        print('Could not load repository at {} :('.format(repo_path))

La fonction principale gère la saisie du GIT_REPO_PATH variable d'environnement et crée un objet Repo basé sur le chemin si possible.

Si le référentiel n'est pas vide, ce qui indique un échec à trouver le référentiel, alors le print_repository et print_commit les fonctions sont appelées pour afficher les données du référentiel.

Si vous souhaitez copier et coller tout le code trouvé ci-dessus à la fois, jetez un œil au read_repo.py fichier sur GitHub.

Il est temps de tester notre script utilisant GitPython. Appelez le read_repo.py fichier à l'aide de la commande suivante.

(gitpy) $ python read_repo.py

Si le virtualenv est activé et le GIT_REPO_PATH La variable d'environnement est définie correctement, nous devrions voir une sortie similaire à la suivante.

Repo at ~/devel/py/fsp/ successfully loaded.
Repo description: Unnamed repository; edit this file 'description' to name the repository.
Repo active branch is master
Remote named "origin" with URL "[email protected]:mattmakai/fullstackpython.com"
Last commit for repo is 1fa2de70aeb2ea64315f69991ccada51afac1ced.
----
1fa2de70aeb2ea64315f69991ccada51afac1ced
"update latest blog post with code" by Matt Makai ([email protected])
2017-11-30 17:15:14-05:00
count: 2256 and size: 254
----
1b026e4268d3ee1bd55f1979e9c397ca99bb5864
"new blog post, just needs completed code section" by Matt Makai ([email protected])
2017-11-30 09:00:06-05:00
count: 2255 and size: 269
----
2136d845de6f332505c3df38efcfd4c7d84a45e2
"change previous email newsletters list style" by Matt Makai ([email protected])
2017-11-20 11:44:13-05:00
count: 2254 and size: 265
----
9df077a50027d9314edba7e4cbff6bb05c433257
"ensure picture sizes are reasonable" by Matt Makai ([email protected])
2017-11-14 13:29:39-05:00
count: 2253 and size: 256
----
3f6458c80b15f58a6e6c85a46d06ade72242c572
"add databases logos to relational databases pagem" by Matt Makai ([email protected])
2017-11-14 13:28:02-05:00
count: 2252 and size: 270

Les commits spécifiques que vous voyez varieront en fonction des 5 derniers commits que j'ai envoyés au référentiel GitHub, mais si vous voyez quelque chose comme la sortie ci-dessus, c'est un bon signe que tout a fonctionné comme prévu.

Quelle est la prochaine ?

Nous venons de cloner un référentiel Git et d'utiliser la bibliothèque GitPython pour lire une multitude de données sur le référentiel et tous ses commits.

GitPython peut cependant faire plus que simplement lire des données - il peut également créer et écrire dans des référentiels Git ! Jetez un œil à la page de documentation sur la modification des références dans le didacticiel officiel GitPython ou revenez ici à l'avenir lorsque j'aurai l'occasion de rédiger une procédure pas à pas GitPython plus avancée.

Des questions? Faites-le moi savoir via un ticket de problème GitHub sur le référentiel Full Stack Python, sur Twitter@fullstackpythonou @mattmakai.

Vous voyez quelque chose qui ne va pas dans cet article de blog ? La source de cette page sur GitHuband soumet une pull request.