目的
gitのコミット情報をcsv形式で取得したかったが
git logの--pretty=formatのオプションでは、私が欲しかったフォーマットで取得できなかったため、 一度ログを出力した上でログの整形を行うようにした。
環境
OS Mac Catalina
Pycharm CE
python 3.7
準備
gitログの取得
GitBashなどのコンソールで叩くとログファイルが出力される。
--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
参考
- Pythonでファイルの読み込み、書き込み(作成・追記) https://note.nkmk.me/python-file-io-open-with/
- Python文字列操作マスター https://qiita.com/tomotaka_ito/items/594ee1396cf982ba9887
- Pythonで文字列の一部を削除(stripなど)https://note.nkmk.me/python-str-remove-strip/
- 【Python3】configparserの使い方とサンプル https://www.mathkuro.com/python/configperser/
- Pythonの設定ファイル管理まとめ https://kodocode.net/python-begin-settings/
- Git log Document https://git-scm.com/docs/git-log
- git ignore https://www.toptal.com/developers/gitignore