Utilisez GitPython

Utilisez GitPython

Cet article est le 17e jour de Git AdventCalendar 2016.

GitPython est une bibliothèque Python pour faire fonctionner Git. Cette fois, nous utiliserons Git Python pour les opérations Git fréquemment utilisées.

L'environnement utilise les éléments suivants.

Installation

$ pip install GitPython

Au moment de la rédaction de ce document, je voulais connaître l'intérieur de GitPython, j'ai donc cloné la source à partir de Github et fait une installation modifiable.

$ git clone [email protected]:gitpython-developers/GitPython.git
$ cd GitPython
$ pip install -e .

L'option -e de pip install -e . est pour une installation modifiable. Cela ne récupérera pas le package de PyPI La bibliothèque est disponible en utilisant la source dans le répertoire spécifié. Utile pendant le développement.

A voir à l'intérieur

GitPython était une implémentation qui exécute des commandes git dans un sous-processus (certaines ne le sont pas). Si vous l'imprimez avant de passer la commande à subprocess.Popen (), Le comportement semblait facile à comprendre, j'ai donc modifié la source.

diff --git a/git/cmd.py b/git/cmd.py
index 1481ac8..8f47895 100644
--- a/git/cmd.py
+++ b/git/cmd.py
@@ -564,6 +564,7 @@ class Git(LazyMixin):
         log.debug("Popen(%s, cwd=%s, universal_newlines=%s, shell=%s)",
                   command, cwd, universal_newlines, shell)
         try:
+            print('[EXECUTE] {}'.format(' '.join(command)))
             proc = Popen(command,
                          env=env,
                          cwd=cwd,

Si vous exécutez la commande GitPython dans cet état, ce sera comme suit.

In [2]: git.Repo.init('fish')
[EXECUTE] git init
Out[2]: <git.Repo "/working/git-python-example/fish/.git">

La place de [EXECUTE] est la commande git réellement exécutée. Cette fois, j'irai avec ça.

repo.git

Vous pouvez utiliser repo.git pour effectuer l'équivalent d'une opération CLI.

git reset --hard HEAD ressemble à ceci:

In [62]: repo.git.reset('--hard', 'HEAD')
[EXECUTE] git reset --hard HEAD
Out[62]: 'HEAD is now at 72a4b4c add b'

git checkout -b fish ressemble à ceci:

In [63]: repo.git.checkout('-b', 'fish')
[EXECUTE] git checkout -b fish
Out[63]: ''

Je me demande comment spécifier cherry-pick car il a - dans son nom. (Vous ne pouvez pas utiliser - dans le nom de la fonction en Python, non?), Utilisez simplement cherry_pick.

In [65]: repo.git.cherry_pick('7465612')
[EXECUTE] git cherry-pick 7465612
Out[65]: '[master d7382d6] add d\n Date: Sat Dec 17 15:10:40 2016 +0900\n 1 file changed, 0 insertions(+), 0 deletions(-)\n create mode 100644 D'

Ensuite, tout semble aller bien de cette façon. Cependant, les méthodes de repo.index etc. ont des noms d'arguments significatifs, Certains exécutent --dry-run à l'avance, Il y a certaines choses qui sont considérées plutôt que de le faire clairement.

Opérations fréquemment utilisées

A partir de là, quel type de commande peut être utilisé autre que de passer des options directement avec repo.git? Je verrai s'il sera émis.

git init

In [2]: repo = git.Repo.init()
[EXECUTE] git init

git add

In [3]: !touch README

In [4]: repo.index.add(['README'])
Out[4]: [(100644, e69de29bb2d1d6434b8b29ae775ad8c2e48c5391, 0, README)]

git commit

In [6]: repo.index.commit('initial commit')
[EXECUTE] git cat-file --batch-check
[EXECUTE] git cat-file --batch
Out[6]: <git.Commit "c1f08a997733cea1124bceefeef67f8bbfdcdd0a">

git reset

In [14]: repo.index.reset()
[EXECUTE] git read-tree --index-output=/working/git-python-example/repo2/.git/06yx3zdq HEAD
Out[14]: <git.index.base.IndexFile at 0x104959458>

git checkout

In [21]: repo.index.checkout(['README'], force=True)
[EXECUTE] git checkout-index --index --force --stdin
Out[21]: ['README']

git checkout -b

Il était difficile de créer une branche avec repo.index, j'ai donc utilisé repo.git.

In [28]: repo.git.checkout('master', b='test')
[EXECUTE] git checkout -b test master
Out[28]: ''

git merge

In [35]: repo.index.merge_tree('test').commit('merged')
[EXECUTE] git read-tree --aggressive -i -m test
Out[35]: <git.Commit "13b98e27f44bd5a40524fe9c8573c40cc7d71168">

git pull

In [36]: repo.create_remote('origin', '[email protected]:TakesxiSximada/testing.git')
[EXECUTE] git remote add origin [email protected]:TakesxiSximada/testing.git
Out[36]: <git.Remote "origin">

git push

In [72]: remote.push('master')
[EXECUTE] git push --porcelain origin master
Out[72]: [<git.remote.PushInfo at 0x104a04eb8>]

--porcelain est une option pour rendre la sortie facile à analyser.

git clone

clone utilise git.Git.clone ()).

In [13]: git.Git().clone('[email protected]:TakesxiSximada/testing.git')
[EXECUTE] git clone [email protected]:TakesxiSximada/testing.git
Out[13]: ''

Recommended Posts

Utilisez GitPython
Utilisez DeepLabCut
Utiliser pycscope
Utilisez des collections.
Utilisation: Django-MySQL
Utilisez Pygments.rb
Utilisez pandas-ply
Utiliser Miniconda
Utiliser le TSC invariant
[C] Utilisez qsort ()
Utiliser l'API JIRA
Utilisez des références faibles
Utiliser django-debug-toolbar de manière non locale
Utiliser l'optimisation des combinaisons