GIT FUSIONためしてみた

Perforceに慣れていなかったので結構躓いたところが多かったのでメモがてら。
基本的には
> GIT FUSION GUIDE (2015.1)
http://www.perforce.com/perforce/r15.1/manuals/git-fusion/index.html

を読んでいって躓いた箇所を記載していく感じで。

#Git-Fusionて何？
>What is Git Fusion?
http://www.perforce.com/perforce/r15.1/manuals/git-fusion/index.html#section_avy_hyc_gl

Git FusionはGitのリモートリポジトリサービスからPerforceサービスへの橋渡しを行ってくれるものです。
Gitで何らかの変更を行い、リモートリポジトリへのpushを行うとGit Fusionでそれを解釈し。Perforceへのsubmitを代行してくれます。
逆にfetchやpullでリモートリポジトリから差分を取得する場合にもPerforceへの問い合わせを行ってくれます。

Gitユーザーはgitでの操作以上のことをせずに、Git Fusionを介してPerforceへの操作も実現できます。

Perforceについてはこちら
>ゲーム開発におけるPERFORCE
http://www.toyo.co.jp/ss/perforce/customers/solutions/game.html

重いバイナリファイルの扱いが軽快にできるのがいいです。プラグインもぼちぼちあるっぽいです（eclipseとかjenkinsとか）。
また、[P4V](http://www.perforce.com/product/components/perforce-visual-client)によるGUI操作が可能なので、非エンジニアへの導入も多少は敷居が下がるかなといった感じです。
20ユーザー20ワークスペースまでなら無料で使えます
>http://www.perforce.com/purchase/pricing-licensing


##インストール方法
サーバーへのインストールは

* OVA
* OSのパッケージ
* Tarballでのマニュアルインストール

のいずれかで可能です。今回はOSのパッケージでやりました。

### パッケージでのインストール
> Installing Git Fusion using OS-Specific Packages
http://www.perforce.com/perforce/r15.1/manuals/git-fusion/chapter_a21_s5v_pl.html

上記に沿ってインストールします。

* perforce-git-fusionをインストールするとperforceとgitユーザーがインストール時に作成されます。
* ユーザーの自動作成を避けたい場合はperforce-git-fusion-baseをインストールすることもできますが、その場合は設定ファイルなどの変更が発生しますので適宜変更していってください。
* 初期設定は

```
# /opt/perforce/git-fusion/libexec/configure-git-fusion.sh
```
を実行した際に行われます。既存のPerforceサービスを用いない場合はGit Fusionと一緒にインストール可能です。

* p4gf_submit_trigger.pyは

```
$ p4gf_submit_trigger.py --install  ssl:myperforceserver:port perforce_super_user password 
```
sslを宣言していないとうまくいかない場合があるので注意。

##ユーザーのセットアップ

>Setting up Users
http://www.perforce.com/perforce/r15.1/manuals/git-fusion/chapter_jqm_pw4_kk.html


###ユーザー全般のこと
* ユーザーのロールは
	* Git author:ファイルを変更する人全般のこと
	* Git commiter:ファイルの変更を確認できる人。commitできない人の代わりに変更をコミットしたりする場合も入る。
	* Git puller:git clone/git pullできる人
	* Git pusher:git pushできる人
* Git→Perforceへの操作はgit-fusion-userが代行してくれる。
* 逆向きも同様（Perforce側で変更された分についてもGitで取得できる）
* git-fusion-userはPerforceのすべてのデポが設置されている箇所の書き込み権限持っている必要あり。
* //.git-fusionにはgit fusionのメタデータが入っている。

###グループのこと
* Git fusionのユーザーの権限はPerforceのグループを利用して管理している。
* グループは以下。グループ作成はperforeceでの作成なのでp4 groupから。
	* Repo-specific permission groups: 特定のリポジトリの権限を管理するグループ。グループ名はpull/pushそれぞれgit-fusion-repo_name-pull/git-fusion-repo_name-push
	* Global permission groups: すべてのリポジトリの権限を管理するグループ（グループ内の人はアクセスできる形）。pull/pushはそれぞれgit-fusion-pull/git-fusion-push
	* Default permissions p4 key: p4 keyのgit-fusion-permission-group-defaultの値で管理する。これを有効にするとグループ関係なくすべてのリポジトリにアクセスできてしまうので無効推奨（デフォルトはnone）。

###GitユーザーとPerforceアカウントのマッピングのこと
* デフォルトの設定だとGit側のコンフィグで設定したユーザー名とメールアドレスとPerforce側のアカウントをマッピングする。
* Perforce側にunknown_gitアカウントを作成しておくとPerforce側にアカウントを持たないgitユーザーからのpushをGit fusionのリポジトリで受け付けることができるようになる。
* ユーザーのマッピングファイルは.git-fusion/users/p4gf_usermap
* Perforceアカウント1つに対して複数のgitユーザーを紐づけることも可能。
* 紐付けたPerforceアカウントの権限はp4 protectテーブルで管理している

###認証のこと
SSHを使用する場合はこちら（Git fusionへの接続について。PerforceとのプロトコルはGit Fusion側でやってる）
>Authenticating Git Users using SSH
http://www.perforce.com/perforce/r15.1/manuals/git-fusion/appendix.ssh.html

SSLを使用する場合はこちら
>Authenticating Git users
http://www.perforce.com/perforce/r15.1/manuals/git-fusion/chapter_jqm_pw4_kk.html#section_vrv_p5g_rl

* apacheのユーザーをgit、グループをperforceにする必要あり（SuexecUserGroupは不可のよう。なのでwebサーバーとの兼用にする場合は注意必要）。

##リポジトリのセットアップ
* リポジトリの設定はp4gf_configに記載する
* グローバルのコンフィグは//.git-fusion/p4gf_config。perforceのサーバーから設定同期したい場合はp4 syncで
* 各リポジトリの設定は //.git-fusion/repos/repo_name/p4gf_config
* viewにブランチごとのマッピング設定を入れる。（perforceの直下の名称depot以外だとうまくいかない？要検証）

現存するgitリポジトリを追加したい場合(※試してないです)
>Importing an existing repo using a Perforce workspace or repo configuration file
http://www.perforce.com/perforce/r15.1/manuals/git-fusion/chapter_dyn_ngj_3l.html#repos.import.pushexisting


##使ってみた感じの印象
立ててみて結構メンテナンスは大変な部分も多いかもしれないですが、メリットもあるのではないかなという感じです（その苦労を上回るかどうかは別として）。
プロジェクト全体の資料やデザイン・音源といったデータはPerforceの領域で管理して、Gitではソースコード中心に管理するのがいいのかなあ、という感じ。
よりよい使い方をもう少し考えてみたいところ。結構勉強になったです。