【Python】【lib】【GitPython】サンプルコード

GitPython を使ったサンプルコード集。

 

GitPython のインストール

  • 本家サイト

 https://github.com/gitpython-developers/GitPython

  • GitPython のインストール
    • 使用する Python は 3.5.3 なので pip3 install GitPython でインストールする
    • もしも Python が 2.X 系なら pip install GitPython とすること
% pip3 install GitPython
Collecting GitPython
  Downloading https://files.pythonhosted.org/packages/88/9c/b462dddb492204417f88d538b0931e87631f2a98afe89842929f4ed9ca5b/GitPython-2.1.9-py2.py3-none-any.whl (447kB)
    100% |████████████████████████████████| 450kB 1.3MB/s 
Collecting gitdb2>=2.0.0 (from GitPython)
  Downloading https://files.pythonhosted.org/packages/e0/95/c772c13b7c5740ec1a0924250e6defbf5dfdaee76a50d1c47f9c51f1cabb/gitdb2-2.0.3-py2.py3-none-any.whl (63kB)
    100% |████████████████████████████████| 71kB 813kB/s 
Collecting smmap2>=2.0.0 (from gitdb2>=2.0.0->GitPython)
  Downloading https://files.pythonhosted.org/packages/e3/59/4e22f692e65f5f9271252a8e63f04ce4ad561d4e06192478ee48dfac9611/smmap2-2.0.3-py2.py3-none-any.whl
Installing collected packages: smmap2, gitdb2, GitPython
Successfully installed GitPython-2.1.9 gitdb2-2.0.3 smmap2-2.0.3

 

サンプルコード

本コードでは以下の Git コマンドを実行している

  • git clone
  • git log
  • git checkout

 

より具体的な処理内容は以下の通り。ただし、rm -rf 処理は危険なのでコメントアウトしている。

% rm -rf /tmp/repo
% mkdir /tmp/repo
% git clone -b master https://github.com/Shougo/echodoc.vim
% cd echodoc
% git log -5
% git checkout -b new_branch

 

GitPython_clone_log_checkout.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import git  # https://github.com/gitpython-developers/GitPython
import traceback
import shutil
from datetime import datetime as dt 
from time import *
from collections import OrderedDict

WORKDIR = '/tmp/'
TARGET = 'https://github.com/Shougo/echodoc.vim'

def do_rmdir( *args ) -> "rm -rf をするが、間違えると危険なので要注意" :
    for p in args:
        try:
            # shutil.rmtree(p)
            print("[Disable] rm -rf {0}".format(p))
        except:
            sys.exit(1)
        else:
            pass

def do_mkdir( *args ):
    for p in args:
        try:
            if not os.path.isdir(p):
                print("mkdir {0}".format(p))
                os.makedirs(p)
            else:
                print("{0} is alreadly existing".format(p))
        except:
            sys.exit(1)
        else:
            pass

if __name__ == '__main__':

    old_cwd = os.getcwd()
    od = OrderedDict()

    try:
        _local_repo = os.path.join(WORKDIR, 'repo')
        _branch = 'master'
        _log_num = 5
        _new_branch= 'new_branch'
        do_rmdir( _local_repo )  # rm -rf /tmp/repo
        do_mkdir( _local_repo )  # mkdir /tmp/repo

        # git clone
        print("[DEBUG] git clone -b {0} {1}".format(_branch, TARGET))
        repo = git.Repo.clone_from( TARGET, _local_repo, branch=_branch)

        # git log -5 を整形して表示する
        print("[DEBUG] git log -{0}".format(_log_num))
        for item in repo.iter_commits(_branch, max_count=_log_num):
            d = dt.fromtimestamp(item.authored_date).strftime("%Y-%m-%d %H:%M:%S")
            h = item.hexsha
            a = item.author
            od[h] = { d : a }
            print("[{0}] {1} [by {2}]".format(d, h, a))

        # Ordereddict の結果
        print("---- Ordereddict の結果 ----")
        for h,v in od.items():
            for k,a in v.items():
                print("[{0}] {1} [by {2}]".format(k, h, a))

        # git checkout -b new_branch をする場合
        print("[DEBUG] git checkout -b {0}".format(_new_branch))
        repo.git.checkout('-b', _new_branch)

    except:
        e = traceback.print_exc()
        print('エラー原因: {0}'.format(e))
        pass
    else:
        pass
    finally:
        os.chdir(old_cwd)