_・)Keep Smiling

モソモソと日々の雑感を書き溜めるというか書き殴るというか書き捨てるというか

Git TownをGithub Enterpriseと一緒に使う

Gitつかってますよね?

開発する人だったら何かしらのバージョン管理システムを利用していると思いますが、その中で最も使われている技術といえばやはりGitでしょう。 また開発にあまり縁がない人、もっと言えば非エンジニアであっても、GithubやGitlabなどを用いればリッチなGUIを使ってチーム内で文章管理が実現できてしまいます。 勝手にドキュメントが上書きされてた!困る!・・・みたいことで困った経験がある方は、Git(Github/Gitlab等)を導入することで、変更点のレビューや反映、ロールバック・・・などの作業が効率よく行えるようになります。

Git(hub/lab)-flowつかってますか?

しかしいくら便利なツールがあっても、チーム内のメンバー各自が自由奔放に更新していっては意味がありません。きちんとコミュニケーションを取りながら、一定のルールのもとで活用してこそ意味があります。

そこで、Gitはこう使うべし!というようなベストプラクティスとも言える考え方がGitーFlowやGithub-FlowやGitlab-flowです。本気でGitを導入したい人は日本語化された記事もあったりしますので一度調べてみるのも良いかもしれません。とはいえ、あくまでもベストプラクティスですし、3つもあってみんな違ってみんな良いかよ!みたいな突っ込みをしたくなるので、まぁ、フワッと理解して実践の中で自分の組織により合った方法を模索していくのが良いのかも知れません。

私の環境では大雑把にこんなルールで運用しています。ちなみにGitHub環境です。

  1. 変更したい場合はmasterから作業用ブランチを切る
  2. 作業用ブランチで変更作業(git add / commit等)をする
  3. Web UI上でPull Request(PR)を作成する
  4. レビュアーにReview / Mergeしてもらう
  5. (不要なら)作業用ブランチを削除する

これらの作業をチーム内で徹底することで、チーム内の共有情報を効率よく複数人で管理していたりします。 ちなみにPRとかMergeされたタイミングなんかでSlack通知させたりもしてます。便利。

Git-Townはいいぞ

ただ、これらの実践には微妙にめんどくさい部分もあります。

  • 毎回ブランチを作成して切り替えるのがめんどい。たまに忘れる。
  • 作業途中にmaster側で変更があったので同期させたいがめんどい。
  • PRのためのWebページを開くのがめんどい。
  • 不要となったブランチをローカルとリモートで削除するのがめんどい。

いずれもまぁ単にめんどくさいってだけなんですが、楽できるなら楽できた方がいいよね。

そこでやくに立つのがGit Townです。

もともと知ったのはMOONGIFTさんの記事だったんですが、しばらく使ってて(私の場合は)特に問題なく便利に使えているのでご紹介したいとおもいます。

Git Townの利点は単純で、前述した作業を非常に簡単に実現できるというところです。 コマンドも必要最低限なのでとても使い易いです。いいぞ。

それでは早速、使い方を見ていきます。

Git-Townのインストール

私の環境はmacOSなので、サクッとHomebrewでインストール可能です。

$ brew install git-town

Homebrewでインストールした場合は、git-townコマンドとしてインストールされます。

また、他環境でもバイナリが用意されてたりするので簡単に導入できそうです。詳しくはGit TownのInstallページをご確認ください。

作業用ブランチを切る

ローカル環境のリポジトリgit-town hack XXXXを実行します。XXXXは作成するブランチ名です。

$ git-town hack new-branch
Git Town needs to be configured

  1: master

Please specify the main development branch by name or number: 1
Please specify a perennial branch by name or number. Leave it blank to finish:

[master] git fetch --prune

[master] git rebase origin/master
Current branch master is up to date.

[master] git checkout -b new-branch master
Switched to a new branch 'new-branch'

$ git branch
  master
* new-branch

途中でメインブランチを聞かれますがmasterを選べば良いでしょう。perennialはぶっちゃけよく分かっていませんがブランクでOKです。まぁ、これだけだったらgit checkout -b new-branch masterと実行してもいいんですけどね。ブランチが複雑な環境で使う場合は、git-townのが扱いやすい気がします(あまりブランチが親子関係をもつような使い方をしたことがない・・・)。

作業開始

必要に応じて変更作業を進めます。git addgit commitすればOKです。いつも通りっすね。

$ echo date > file1.txt
$ echo date > file2.txt
$ echo date > file3.txt
$
$ git add -A
$ git commit -m "adding 3 files"
[new-branch bea7723] adding 3 files
 3 files changed, 3 insertions(+)
 create mode 100644 file1.txt
 create mode 100644 file2.txt
 create mode 100644 file3.txt

この時点でmasterブランチにcommitがあったらどうしたら良いでしょうか? 慌てずにgit-town syncとしてあげれば大丈夫です。

$ ls
README.md  file1.txt  file2.txt  file3.txt
$
$ git-town sync

[new-branch] git fetch --prune
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 8 (delta 2), reused 1 (delta 0), pack-reused 0
Unpacking objects: 100% (8/8), done.
From (Github EnterpriseのURL):(アカウント名)/tsukaman.test
   2f44349..09c979e  master     -> origin/master

[new-branch] git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

[master] git rebase origin/master
First, rewinding head to replay your work on top of it...
Fast-forwarded master to origin/master.

[master] git checkout new-branch
Switched to branch 'new-branch'

[new-branch] git merge --no-edit master
Merge made by the 'recursive' strategy.
 NewfileOnMaster1.txt | 1 +
 NewfileOnMaster2.txt | 1 +
 NewfileOnMaster3.txt | 1 +
 3 files changed, 3 insertions(+)
 create mode 100644 NewfileOnMaster1.txt
 create mode 100644 NewfileOnMaster2.txt
 create mode 100644 NewfileOnMaster3.txt

[new-branch] git push -u origin new-branch
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 510 bytes | 510.00 KiB/s, done.
Total 5 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 1 local object.
To (Github EnterpriseのURL):(アカウント名)/tsukaman.test.git
 * [new branch]      new-branch -> new-branch
Branch new-branch set up to track remote branch new-branch from origin.

$ ls
NewfileOnMaster1.txt  NewfileOnMaster3.txt  file1.txt             file3.txt
NewfileOnMaster2.txt  README.md             file2.txt

途中で何を実行したのか表示されるのは良いところですね。ちなみに、Git-TownのデフォルトのPull Strategyはrebaseですがmergeを選択することも可能だそうです。

PRをしてみよう

ではPull Requestしてみます。普通だったらまずリモートの作業用ブランチにCommitをPushしてWebページからPull Requestを作成するのですが、Git-Townではコマンド一発です。

$ git-town new-pull-request
Error: Unsupported hosting service

This command requires hosting on one of these services:
* Bitbucket
* Github
* Gitlab

Usage:
  git-town new-pull-request [flags]

Flags:
      --abort      Abort a previous command that resulted in a conflict
      --continue   Continue a previous command that resulted in a conflict

Unsupported hosting service

This command requires hosting on one of these services:
* Bitbucket
* Github
* Gitlab

おやぁ、、、??エラーになりましたね。

というのも実はこのリポジトリGithub Enteprise上のリポジトリで、要はドメイン名がgithub.comのURLではないんですね。

出力の通りGit-TownではBitbucket、Github、Gitlabのそれぞれに対応しているのですが、今回のエラーはソレのどれかを判別できなかったというものですね。

そこで明示的にGithubを使わせる設定を入れて再実行してみます。

$ git config git-town.code-hosting-driver github
$ git-town new-pull-request

[new-branch] git fetch --prune

[new-branch] git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

[master] git rebase origin/master
Current branch master is up to date.

[master] git checkout new-branch
Switched to branch 'new-branch'
Your branch is up-to-date with 'origin/new-branch'.

[new-branch] git merge --no-edit origin/new-branch
Already up-to-date.

[new-branch] git merge --no-edit master
Already up-to-date.

open https://(Github EnterpriseのURL)/(アカウント名)/tsukaman.test/compare/new-branch?expand=1

しばらくするとブラウザでPRの画面が開きます。

f:id:tsukaman:20171203173414p:plain

あとは通常通りにPRだしてReviewとMergeを待つ感じです。

不要なブランチの削除

私は作業用ブランチは毎回削除しています。その削除もGit-Townなら簡単です。

$ git-town kill

[new-branch] git fetch --prune

[new-branch] git push origin :new-branch
To (Github EnterpriseのURL):(アカウント名)/tsukaman.test.git
 - [deleted]         new-branch

[new-branch] git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

[master] git branch -D new-branch
Deleted branch new-branch (was 49435fb).

まとめ

Git-Townは死ぬほど便利!ないと生きていけない!という程ではないのですが、それであると効率よく作業できて嬉しいです。

実はしばらくPRの画面を開くが上手く出来てなかった(なぜかgithub.comが開く)のですが、改めて調べてやってみたらさっくり出来てしまったので今回記事にしてみました。シンプルで使いやすい良いツールだと思いますので皆さんもぜひご賞味ください。

うーまーいぜぇー。