git stashでオートセーブを実現するatom packageを作った

(この記事はAtom Advent Calendar 2016 に参加しています: http://qiita.com/advent-calendar/2016/atom )

 

かつて、こんなことはなかったでしょうか:

チームでgitを使っていて、masterの変更を反映させたいとき。

「ローカルの編集を退避させたいのだけど、stashでなんかよくわからん記録をつくるほどでもないし、コンフリクトしているファイルだけcheckoutしちゃおう。」

「よし、mergeできた。(俺もgit使いこなせるようになってきたナァ)」

―10分後

「よし、全体をbuildしてruntimeテストしよう」 → ERROR

ナンデ!?

 

gitの操作によって必要なローカルの変更を削除しちゃう経験、ありませんでしたか?僕はありました。

むしゃくしゃしたのでこれを解消するatom packageを作りました。(実際にはどちらかというと泣きそうになりました)

git-auto-stash

https://atom.io/packages/git-auto-stash です。

これを導入することで、定期的にgit stashが作られ、ファイル喪失の悲劇が多少減るのでは、と思っています。ぜひ使っていただいて、必要な機能などフィードバックをください。

 

自動保存を実現するしくみ

gitってファイルの履歴が保存されるんだし、gitの機能をどうにか使ってこの自動保存の仕組みを作れないか、と考えていたところ、「working treeに影響を及ぼさずにgit stashを作る方法」があることを知りました。

git stash create + git stash store -m <コメント> <hash>

です。

これを定期的に行うことで、トラッキングされているファイルであれば、stashに保存されるようになります。こちらはなにも考えなくてよしなにしてくれるというのが素晴らしいですね。具体的には、atom.workspace.observeTextEditorsで取得できるeditorのonDidStopChangingを使って保存のトリガーとしています。

何分ごとに保存するか、auto stashの最大数はいくらにするかはsettings画面から指定できます。

 

atomナンデか

DropboxやTimeMachineでいいじゃん、という人もいるでしょう。

しかしこうした汎用的なサービスはいちいち過去ファイルを掘っていくのが面倒だし、それならば開発の際に必ずと言っていいほどお世話になるgitとatomで完結するほうが、僕には気持ちの良い解決に思えたのです。

また、sublimetextじゃないの?て人もいるかと思いますが、もうatomに乗り換えちゃいなよ、と言っておきます。それぐらいatomは進化しています。

atomはsublimetextよりも思想的に優れて(electronを採用してる点とか)いたものの恋に落ちるような心地よさは微塵も無く、僕も何度か乗り換えを試みましたが最終的には殺意とともに離別したものでした。ところが今年の10月ごろに半年ぶり4度目ぐらいの乗り換えを試みたところ起動はすんなり、packageもほぼエラーが起きない、書いていてウザい機能がオプションで無効化できる、さらにelectronならではの異常に便利なpackage群が僕を待っていました。

ES6ムズいね

はじめてES6を触ったのでPromiseの理解に最初はとても苦しみました。結果なんとか動くコードにはなったものの間違いなくベストプラクティスに則っていないため、pull requestお待ちしております。

いまは指定した分数ごとにauto stashを行うだけですが、1分前、10分前、30分前、60分前、3時間、6時間、12時間、24時間ぐらいに一定間隔の過去stashを保存しておく機能は今後追加したいなと思っています。

Leave a Comment

Your email address will not be published. Required fields are marked *