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環境です。
- 変更したい場合はmasterから作業用ブランチを切る
- 作業用ブランチで変更作業(git add / commit等)をする
- Web UI上でPull Request(PR)を作成する
- レビュアーにReview / Mergeしてもらう
- (不要なら)作業用ブランチを削除する
これらの作業をチーム内で徹底することで、チーム内の共有情報を効率よく複数人で管理していたりします。 ちなみに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 add
やgit 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の画面が開きます。
あとは通常通りに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が開く)のですが、改めて調べてやってみたらさっくり出来てしまったので今回記事にしてみました。シンプルで使いやすい良いツールだと思いますので皆さんもぜひご賞味ください。
うーまーいぜぇー。