メンチカツには醤油でしょ!!

AWS/Java/Node.js/Spreadsheets/Docker/Jenkins/コミュニティ・勉強会レポを主とした技術系ブログ

GitBucketのユーザー名(USER_NAME)を変更

前回、

ryoichi0102.hatenablog.com

という記事を書きましたが
たとえばサーバー引っ越しの際に、AD連携(LDAP認証)に切り替えるぞ!
なんて変更があったりすると
ユーザー名をドメインアカウントに名寄せする必要が出てくるわけですね。
しかしながらユーザーが既存で持っているリポジトリ
Issues・PR・活動履歴をそのまま残したいとなりますので
今回はその際にやったことです。

Gistのプラグイン入れていたので、説明にはGistのものも入っています。

サーバー内のディレクトリ名の変更

/.gitbucket/data/【ユーザー名】
/.gitbucket/gist/【ユーザー名】
/.gitbucket/repositories/【ユーザー名】

H2 Databaseの変更

GitBucketはH2 Databaseという
右上メニューから⇒System Administration⇒H2 Consoleと進み
接続画面では
JDBC URL: jdbc:h2:~/.gitbucket/data (初期値testなので注意)
User Name: sa
Password: sa
を入力します。

色々テーブルがあるんですが
アカウント(ACCOUNT)とリポジトリ(REPOSITORY)は
外部制約(外部キー)があり親子テーブルを同時に更新できないので
名前違いのレコードを複製します。

insert into ACCOUNT (
USER_NAME,REPOSITORY_NAME,PRIVATE,DESCRIPTION,DEFAULT_BRANCH,REGISTERED_DATE,UPDATED_DATE,LAST_ACTIVITY_DATE,ORIGIN_USER_NAME,ORIGIN_REPOSITORY_NAME,PARENT_USER_NAME,PARENT_REPOSITORY_NAME
) select
'obara',REPOSITORY_NAME,PRIVATE,DESCRIPTION,DEFAULT_BRANCH,REGISTERED_DATE,UPDATED_DATE,LAST_ACTIVITY_DATE,ORIGIN_USER_NAME,ORIGIN_REPOSITORY_NAME,PARENT_USER_NAME,PARENT_REPOSITORY_NAME
from ACCOUNT where USER_NAME = 'obama';

 とか

insert into REPOSITORY (
USER_NAME,REPOSITORY_NAME,PRIVATE,DESCRIPTION,DEFAULT_BRANCH,REGISTERED_DATE,UPDATED_DATE,LAST_ACTIVITY_DATE,ORIGIN_USER_NAME,ORIGIN_REPOSITORY_NAME,PARENT_USER_NAME,PARENT_REPOSITORY_NAME
) select
'obara',REPOSITORY_NAME,PRIVATE,DESCRIPTION,DEFAULT_BRANCH,REGISTERED_DATE,UPDATED_DATE,LAST_ACTIVITY_DATE,ORIGIN_USER_NAME,ORIGIN_REPOSITORY_NAME,PARENT_USER_NAME,PARENT_REPOSITORY_NAME
from REPOSITORY where USER_NAME = 'obama';

を実行します。

次に各テーブルのUPDATE文ですね。

UPDATE ACCOUNT SET USER_NAME = 'obara' where USER_NAME = 'obama';
UPDATE ACTIVITY SET USER_NAME = 'obara' where USER_NAME = 'obama';
UPDATE ACTIVITY SET ACTIVITY_USER_NAME = 'obara' where ACTIVITY_USER_NAME = 'obama';
UPDATE COLLABORATOR SET USER_NAME = 'obara' where USER_NAME = 'obama';
UPDATE COLLABORATOR SET COLLABORATOR_NAME = 'obara' where COLLABORATOR_NAME = 'obama';
UPDATE GIST SET USER_NAME = 'obara' where USER_NAME = 'obama';
UPDATE GROUP_MEMBER SET USER_NAME = 'obara' where USER_NAME = 'obama';
UPDATE ISSUE SET USER_NAME = 'obara' where USER_NAME = 'obama';
UPDATE ISSUE SET OPENED_USER_NAME = 'obara' where OPENED_USER_NAME = 'obama';
UPDATE ISSUE SET ASSIGNED_USER_NAME = 'obara' where ASSIGNED_USER_NAME = 'obama';
UPDATE ISSUE_COMMENT SET USER_NAME = 'obara' where USER_NAME = 'obama';
UPDATE ISSUE_COMMENT SET COMMENTED_USER_NAME = 'obara' where COMMENTED_USER_NAME = 'obama';
UPDATE ISSUE_ID SET USER_NAME = 'obara' where USER_NAME = 'obama';
UPDATE ISSUE_LABEL SET USER_NAME = 'obara' where USER_NAME = 'obama';
UPDATE LABEL SET USER_NAME = 'obara' where USER_NAME = 'obama';
UPDATE PULL_REQUEST SET USER_NAME = 'obara' where USER_NAME = 'obama';
UPDATE PULL_REQUEST SET REQUEST_USER_NAME = 'obara' where REQUEST_USER_NAME = 'obama';
UPDATE REPOSITORY SET USER_NAME = 'obara' where USER_NAME = 'obama';
UPDATE SSH_KEY SET USER_NAME = 'obara' where USER_NAME = 'obama';

です。

※ 免責事項

当blogの通りにやって必ずうまくいくことを保証・証明するものではないので
移行は慎重にお願いします。