非公開で作ってるゲームプログラムの一部だけ外部公開しよう
ぶっちゃけ、作業メモ。だれかの参考になれば幸い。
まずは背景
現在、以下のブログに書いたように、自作ゲーム制作用のゲームエンジンSplitterSpriteを作成中です。 そして、このプログラムはGithub公開していきたい。 polyhedron2.hatenablog.com
私のサークル「魔法厨房」としては、このSplitterSpriteを実際に使ってゲームを作っていくことで、エンジンを使いやすいようにブラッシュアップしていきたいのですが…。 コミケなど頒布予定のゲームの内部プログラム全部を公開しちゃうというのも微妙なところです。
だって、コミケでゲームを1000円でお手に取ってもらったのに、「そのプログラムは実はネットで無料で全公開です!」ってなったら、買ってくださった方と、無料でできる方が出てきてしまうわけですから。
ということで、ゲームをつくるときには、「そのゲーム特有のプログラム」は非公開で、「SplitterSpriteエンジンプログラム」は公開で、管理していきたいというわけです。SplitterSpriteは前述のとおりGithubで管理するとして、「そのゲーム特有のプログラム」もGitの非公開リポジトリを作って管理します。
今回の目的
非公開リポジトリは今回はBitbucketのサービスを使って作ることにしました。 非公開リポジトリの個数上限なし。参加人数は5人までと制約がありますが、魔法厨房は現在2人なので問題なしです。 リポジトリ名は「dotrium」です。
Githubリポジトリは現在公開中のこちらです。リポジトリ名は「SplitterSprite3」です。 github.com
これらに対して、以下の構造で管理できるようにしよう!というのが今回の目的です。
具体的にどうしたか
git submodule
機能を使いました。
git submodule
を使うと、とあるリポジトリX(今回はSplitterSprite3)を別のリポジトリY(今回はdotrium)の一部として扱うことができます。
使ってみると以下のような感じ。Yにあたるリポジトリに入って、XのリポジトリURLをsubmoduleで登録すると、Xがサブディレクトリとして作られます。.gitmodules
というファイルも作られていますね。
$ cd dotrium $ ls -a .git $ git submodule add git@github.com:polyhedron2/SplitterSprite3.git Cloning into 'SplitterSprite3'... remote: Counting objects: 11, done. remote: Compressing objects: 100% (8/8), done. remote: Total 11 (delta 1), reused 8 (delta 0), pack-reused 0 Receiving objects: 100% (11/11), done. Resolving deltas: 100% (1/1), done. $ ls -a .git .gitmodules SplitterSprite3
この時、dotriumのgitではSplitterSprite3のコード自体は差分として扱われず、コミット番号情報が管理されます。 dotriumのコミット内容は以下のスクショの通り。SplitterSprite3の中身は無く、SplitterSprite3のリポジトリURLとコミット番号「84a368d...」だけがある状態です。
この時、dotriumディレクトリ内に作られたSplitterSprite3ディレクトリに入ると、そこはSplitterSprite3のリポジトリです。 ここで変更をPushするとそのまま、GitHubにコミットが送られます。今回は「.gitignoreを追加」コミットをして、コミット番号が「13801f0...」になりました。
さて、この時dotriumのリポジトリから見ると、管理しているSplitterSprite3のコミット番号だけの差分が生じている状態です。なので、dotriumの差分をコミットすると以下のようになります。
コミット番号が「84a368d...」から「13801f0...」になっていますね。
これで、SplitterSprite3内のプログラムはGitHubの公開リポジトリに、他のプログラムはBitbucketの非公開リポジトリに、反映されるようになりました。目的達成です。
まとめと感想
自分の非公開にしたいプログラムを一部公開したいときにはgit submodule
で一発。
なにやら、あっけないけど、これくらいシンプルなのがいいよね。