LoginSignup
1
1

More than 3 years have passed since last update.

Gitログを整形して、コミットしたファイル名をcsv形式で取得する

Last updated at Posted at 2020-10-11

目的

gitのコミット情報をcsv形式で取得したかったが
git logの--pretty=formatのオプションでは、私が欲しかったフォーマットで取得できなかったため、 一度ログを出力した上でログの整形を行うようにした。

環境

OS Mac Catalina
Pycharm CE
python 3.7

準備

gitログの取得

GitBashなどのコンソールで叩くとログファイルが出力される。
git --no-pager log --name-status --no-merges --all \
--date-order --date=format:'%Y/%m/%d %H:%M:%S' > git.log

取り込む想定のgitログ
git.log
commit f36da445d06d2db7b4f08a508be835f5464ded
Author: nomori<hoge@example.com>
Date:   2020/10/10 23:50:29
    first commit.
A   .gitignore
A   perse_git_log.py

実装

perse_git_log.py
import re
import csv
import os

COMMIT_ID = 'commit '
STATUS_ADD = 'A '
STATUS_MOD = 'M '
STATUS_DEL = 'D '
GIT_AUTHOR = 'Author: '
GIT_DATE = 'Date:   '

path = './input/git.log'

# gitのlogファイルを読み込む.
array_commit_info = []
with open(path) as git_log_file:
    data = git_log_file.readlines()

for item in data:
    # 末尾の改行コードを削除.
    item = item.replace('\n', '')

    if COMMIT_ID in item:
        # コミットのハッシュIDを取得.
        commit_id = item.replace(COMMIT_ID, '')

    elif GIT_AUTHOR in item:
        # コミットしたユーザー情報を取得.
        author_tmp = item.replace(GIT_AUTHOR, '')
        # メールアドレス部分を削除.
        author = re.sub(' +<.*>', '', author_tmp)

    elif GIT_DATE in item:
        # コミット日時を取得.
        date = item.replace(GIT_DATE, '')

    else:
        # ファイルの変更履歴を取得.
        file_status = item[0:2]
        if file_status == STATUS_ADD or file_status == STATUS_MOD or file_status == STATUS_DEL:
            # Gitのステータスを除いたファイル名の取得.
            file_name = item[2:]
            # 出力用の配列に情報を保持.
            array_commit_info.append([commit_id, author, date, file_name])

print(array_commit_info)

# CSV形式で出力.
file_path = './output/'
if not os.path.exists(file_path):
    os.mkdir(file_path)

output_filename = file_path + 'git_output.csv'
with open(output_filename, 'w') as f:
    writer = csv.writer(f)

    # ヘッダ情報を出力.
    writer.writerow(['COMMIT_ID', 'AUTHOR', 'DATE', 'COMMIT_FILE_NAME'])
    for line_data in array_commit_info:
        # コミット情報を出力.
        writer.writerow(line_data)

出力例

git_output.csv
f36da445d06d2db7b4f08a508be835f5464ded,nomori,2020/10/10 23:50:29,.gitignore
f36da445d06d2db7b4f08a508be835f5464ded,nomori,2020/10/10 23:50:29,perse_git_log.py

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1