Verwenden Sie GitPython

Verwenden Sie GitPython

Dieser Artikel ist der 17. Tag von Git AdventCalendar 2016.

GitPython ist eine Python-Bibliothek zum Betreiben von Git. Dieses Mal werden wir Git Python für die häufig verwendeten Git-Operationen verwenden.

Die Umgebung verwendet Folgendes.

Installation

$ pip install GitPython

Zum Zeitpunkt des Schreibens dieses Dokuments wollte ich das Innere von GitPython kennen, also habe ich die Quelle von Github geklont und eine bearbeitbare Installation durchgeführt.

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

Die Option "-e" von "pip install -e" ist für eine bearbeitbare Installation. Dadurch wird das Paket nicht von PyPI abgerufen Die Bibliothek ist über die Quelle im angegebenen Verzeichnis verfügbar. Nützlich während der Entwicklung.

Um nach innen zu sehen

GitPython war eine Implementierung, die Git-Befehle in einem Unterprozess ausführt (einige nicht). Wenn Sie es drucken, bevor Sie den Befehl an subprocess.Popen () übergeben, Das Verhalten schien leicht zu verstehen, deshalb habe ich die Quelle geändert.

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,

Wenn Sie den GitPython-Befehl in diesem Status ausführen, ist dies wie folgt.

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

Der Ort von "[EXECUTE]" ist der tatsächlich ausgeführte git-Befehl. Diesmal werde ich damit gehen.

repo.git

Sie können repo.git verwenden, um das Äquivalent einer CLI-Operation auszuführen.

git reset --hard HEAD sieht so aus:

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 sieht so aus:

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

Ich frage mich, wie man "Cherry-Pick" spezifiziert, weil es "-in seinem Namen hat. (In Python können Sie im Funktionsnamen nicht- verwenden, oder?) Verwenden Sie einfach 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'

Dann scheint auf diese Weise alles in Ordnung zu sein. Die Methoden von repo.index usw. haben jedoch aussagekräftige Argumentnamen. Einige führen "--dry-run" im Voraus aus, Es gibt einige Dinge, die in Betracht gezogen werden, anstatt sie klar zu machen.

Häufig verwendete Operationen

Welche Art von Befehl kann von nun an verwendet werden, außer Optionen direkt mit repo.git zu übergeben? Ich werde sehen, ob es ausgestellt wird.

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

Es war schwierig, einen Zweig mit repo.index zu erstellen, daher habe ich repo.git verwendet.

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 ist eine Option, um die Ausgabe einfach zu analysieren.

git clone

Klon verwendet 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

Verwenden Sie GitPython
Verwenden Sie DeepLabCut
Verwenden Sie pycscope
Verwenden Sie Sammlungen
Verwenden Sie: Django-MySQL
Verwenden Sie Pylements.rb
Verwenden Sie Pandas-Ply
Verwenden Sie Miniconda
Verwenden Sie Invariant TSC
[C] Verwenden Sie qsort ()
Verwenden Sie die JIRA-API
Verwenden Sie schwache Referenzen
Verwenden Sie die django-debug-Symbolleiste nicht lokal
Verwenden Sie die Kombinationsoptimierung