Subversion(SVN)は、ソフトウェート開発やドキュメント管理に広く使われるバージョン管理システムです。
PythonからSVNを操作する際には「pysvn」ライブラリが非常に便利です。
この記事では、pysvnを使ったSVNの基本操作から応用までを網羅的に解説します。
まずはpysvnをインストールしましょう。
pip install pysvn
SVNリポジトリを新規作成する方法です。
import pysvn
client = pysvn.Client()
repository_path = 'file:///path/to/your/repository'
client.create_repository(repository_path)
print(f'リポジトリを作成しました: {repository_path}')
リポジトリから作業コピーをチェックアウトします。
working_copy_path = '/path/to/your/working-copy'
client.checkout(repository_path, working_copy_path)
print(f'作業コピーをチェックアウトしました: {working_copy_path}')
作業コピーにファイルを追加または削除します。
# ファイル追加
file_path = f'{working_copy_path}/hello.txt'
with open(file_path, 'w') as f:
f.write('Hello, pysvn!')
client.add(file_path)
# ファイル削除(例)
client.remove(file_path)
作業コピーの変更内容をリポジトリにコミットします。
commit_message = 'Add hello.txt'
client.commit(working_copy_path, commit_message)
print('コミットしました')
リポジトリの最新状態に作業コピーを更新します。
client.update(working_copy_path)
print('作業コピーを更新しました')
作業コピーの変更状況を確認します。
status_list = client.status(working_copy_path)
for item in status_list:
print(f'ファイル: {item.path}, 状態: {item.text_status}')
リポジトリのコミットログを取得します。
import time
log_entries = client.log(repository_path, limit=10)
for entry in log_entries:
print(f'リビジョン: {entry.revision.number}')
print(f'作者: {entry.author}')
print(f'日時: {time.ctime(entry.date)}')
print(f'メッセージ: {entry.message}\n')
リポジトリ内でブランチやタグを作成します。
src_path = f'{repository_path}/trunk/hello.txt'
dst_path = f'{repository_path}/branches/hello_branch/hello.txt'
message = 'Create branch for hello.txt'
client.copy(src_path, dst_path, message)
print('ブランチを作成しました')
ブランチやタグの変更をtrunkなどにマージします。
from_path = f'{repository_path}/branches/hello_branch/hello.txt'
to_path = f'{working_copy_path}/hello.txt'
message = 'Merge branch to trunk'
client.merge(from_path, pysvn.Revision(pysvn.opt_revision_kind.number, 1),
to_path, pysvn.Revision(pysvn.opt_revision_kind.head),
to_path, force=True)
client.commit(working_copy_path, message)
print('マージをコミットしました')
※マージ処理は状況によってパラメータ調整が必要です。
作業コピーとリポジトリのファイルを比較します。
diff = client.diff(working_copy_path, f'{working_copy_path}/hello.txt')
print('差分:')
print(diff)
ファイルをロック・アンロックします。
# ロック
client.lock(f'{working_copy_path}/hello.txt', 'ロックメッセージ')
print('ファイルをロックしました')
# アンロック
client.unlock(f'{working_copy_path}/hello.txt')
print('ファイルをアンロックしました')
ファイルやディレクトリにSVNプロパティを設定・取得します。
# プロパティ設定
prop_name = 'svn:keywords'
prop_value = 'Id'
client.propset(prop_name, prop_value, f'{working_copy_path}/hello.txt')
# プロパティ取得
props = client.proplist(f'{working_copy_path}/hello.txt')
for name, value in props:
print(f'プロパティ名: {name}, 値: {value}')
作業コピーやリポジトリからファイルをエクスポートします。
export_path = '/path/to/export'
client.export(repository_path, export_path)
print(f'エクスポートしました: {export_path}')
ファイルやディレクトリを移動・リネームします。
src = f'{working_copy_path}/hello.txt'
dst = f'{working_copy_path}/hello_new.txt'
client.move(src, dst)
client.commit(working_copy_path, 'ファイル名を変更')
print('ファイルをリネームしました')
pysvnを使えば、SVNの基本的な操作から応用的な操作まで、ほぼすべてをPythonで自動化できます。
コミットやブランチ作成、マージ、プロパティ管理など、開発プロセスに必要な操作を網羅的に扱えるのがpysvnの強みです。