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.
$ 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.
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.
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