詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

Gitのおすすめエイリアス5選

緊急新人エンジニア応援企画! ということで自分が Git のエイリアスとして設定している便利コマンドを紹介していく。

直前のコミットに追いコミットする (git fixit)

git commit --amend --no-edit

もろもろ整えて git push しよう、とすると「あっちょっと修正したい」となるのはよくあること。その際いちいちコミットメッセージを書いて rebase するかというとそんな面倒はとりたくなく、一撃で終わらせたい。--no-edit でコミットメッセージを編集せずに --amend できる。

git fixit に設定している。git commit の引数をそのまま受け付けるので、git fixit -agit fixit <file> のように使える。

メインブランチに戻る (git com)

 f() { remote_head=$(git symbolic-ref --quiet refs/remotes/origin/HEAD); remote_head=${remote_head#refs/remotes/origin/}; git checkout ${remote_head:-$(git rev-parse --symbolic --verify --quiet main || git rev-parse --symbolic --verify --quiet master)}; }; f

最近だと main。または master ブランチに戻る。作業を一旦完了したときとか、メインブランチが進んでるので pull しておきたいときとかに使う。f() を定義してから呼び出してるのは、エイリアスからシェル呼び出しを使う際に引数をとれるようにするためのイディオムのようなもの。ここでは使ってないけど。。

git com にしてる。git cogit checkout にしてるので。"git checkout main".

git config --global alias.com '!f() { ... }; f' のように ! を付与して設定してください。

最近チェックアウトしたブランチを一覧する (git r)

git reflog -n 50 --pretty='format:%gs' | perl -anal -e '$seen{$1}++ or print $1 if /checkout:.*to (.+)/'

git r にしてる。複数のことを同時に進めてるとブランチ名も思い出せないのでこういうのでナビゲーションする。-n 50 のところは --since '1 weeks ago' などとしてもよいと思う。自分のリズムで。

ブランチやファイルを github.com で閲覧する (git o)

git browse-remote

git-browse-remote で、ブランチやファイルをブラウザで開いたり URL を標準出力に吐き出したりする。

git o にしてます。最近は gh でもっと便利になるのかもしれないがまだ移行する理由がない。git prgit browse-remote --pr を呼び出し、プルリクエストも開けるようにしている。

コミットの SHA-1 を得る (git sha)

f() { git rev-parse "${1-HEAD}"; }; f

git sha にしてます。たま~に使う。これは引数とれるパターン。

Gatsbyでポートフォリオサイトを作った

motemen.works

ポートフォリオはだいぶ前に Middleman で作ったきり放置していたのだけど、最近 motemen.works というドメインのインスピレーションを得たので、新しく作ることにした。こういうのは勢いだ。

Gatsby を使う

静的サイトのビルダには Gatsby を使うことにした。まあここは何でもよかったのだけど、結果的にはよかった。React+TypeScript で書けると安心感があるし、今はやってないが JS で動きをつけてやろうってときにスムーズそう。導入もスムーズだった。公式ウェブサイトから「Getting Started」をクリックすると Gatsby Cloud の登録フォームに遷移するのを除けばな……。

Gatsby で知らなくて驚いたのが GraphQL でデータをクエリできること。かっこよくてテンションが上がってしまった。しかし知らんかったのは自分だけっぽい。このデータソースをプラグインで拡張することもできる。なるほどなぁ~。

作品リストをスプレッドシートで管理する

過去のポートフォリオでは制作物一覧を YAML で管理していたのだけど、これに追記するのが面倒で更新が滞っていたところがある。気もする。そこで今回以降、制作物の一覧をスプレッドシートで管理することにした。これを Gatsby のデータソースに加え、一覧として生成してやればいい!

これを実現するのは非常に簡単で、

  1. スプレッドシートのデータを TSV としてダウンロードし、
    • Google スプレッドシートでは /export?format=tsv で可能
  2. そのファイルを gatsby-transformer-csv でデータソースに追加し、
  3. GraphQL でクエリするだけ。

シートにしたことでカラムの追加も簡単になり、トップページに選集として表示するものとかもう公開されていないものとかを示すフラグも今回加えられた。選集言いたかっただけという説も有力です。

Cloudflare Pages にデプロイ。GitHub Pages はあきらめた

もともとのホームページは GitHub Pages にホストしていたのでここに CNAME を追加してリダイレクトしてやろうとしたのだけど、そうするとこれ以外のリポジトリの Pages (漢字ルとか)の URL も勝手に 301(!)リダイレクトされてしまうようだったので、諦めて、今回は Cloudflare Pages にデプロイすることにした。

GitHub リポジトリと連携すれば勝手にビルドとデプロイを行ってくれるようだったのでほぼ設定いらずだった。Gatsby の最新バージョンが動くように NODE_VERSION 環境変数を 16 に設定だけしたかな。ビルドには、というかほとんど依存のインストールなんだけど、2-3 分ほどかかる模様。

GitHub Pages からのリダイレクトには以下のような HTML を置いてお茶を濁している。2022 年でも http-equiv=refresh とか書くんか、と思いはする。

<!DOCTYPE html>
<html>
  <link rel="canonical" href="https://motemen.works/">
  <meta http-equiv="refresh" content="0; URL=https://motemen.works/">
  <body>
    <a href="https://motemen.works/">motemen.works</a>
  </body>
</html>

gotest.toolsを使う

docker/compose は Go で書かれてるが、これのテストに gotest.tools というライブラリが使われていた。あまり見たことがなかったけど、使ってみたらわりと手触りがよかったのでここに記しておく。

gotest.tools はいつもの testing パッケージを拡張するようなライブラリ集。あとテストを実行するための CLI も提供している。GitHub Org は gotestyourself という名前だけど、これは洒落てるのかどうか不明(洒落てないほうに賭ける)。

assert, cmp

gotest.tools/v3/assert が多分このライブラリのコア。主な API は assert.Check(t, comparison, msgAndArgs...) で、シグネチャを見たらあーそういうやつねと分かると思う。

予想通り comparison の中身しだいで t.Fail() するかどうか決めてくれるものだが、ここに単に false (bool) を渡したときが便利で、ただ「true じゃなかったよ」と言うのではなくどんな式を評価した結果そうなったのかを教えてくれる。

package main

import (
    "testing"
    "gotest.tools/v3/assert"
)

func add(x, y int) int {
    return x - y // BUG
}

func TestAdd(t *testing.T) {
    // assertion failed: expression is false: add(1, 2) == 3
    assert.Check(t, add(1, 2) == 3)
}

add(1, 2) == 3 が偽だったと。なるほど。テストにいちいちメッセージを書いていくのは面倒なので、真偽を返す式からメッセージを組み立ててくれるのはありがたい。

この comparison には error(もちろん nil のときにテストが通る) を渡せるほかに、cmp.Comparison を与えることもできる。よくあるメッセージつきのカスタム比較構造体だけど、このファミリーにある cmp.DeepEqual() では内部で google/go-cmp を利用している。

基本的に Go のテストは素の testing で書き、複雑になってきたら go-cmp を使う、という感じに書いてたのでこれは便利だった。

package main

import (
    "testing"
    "gotest.tools/v3/assert"
    // is という名前でインポートしてほしいらしい
    is "gotest.tools/v3/assert/cmp"
)

type Record struct {
    X int
}

func TestRecord(t *testing.T) {
    expected := Record{
        X: 1,
    }

    got := Record{
        X: 666,
    }

    // assertion failed:
    // --- expected
    // +++ got
    //   main.Record{
    // -       X: 1,
    // +       X: 666,
    //   }
    assert.Check(t, is.DeepEqual(expected, got))
}

ここでも地味に、メッセージ中に渡した変数名が使われていてありがたいですね。

gotestsum

ライブラリじゃないけど gotestsum というツールも提供している。これは go test の代替みたいな趣。README にあるスクリーンキャストを見ると様子がわかる。ドットが並んでるやつがかっこいい。

……のだけど docker/compose の v2 ブランチではしれっと使わなくなってたのでもうディスコンなのかもしれない。

ほかにもいくつかパッケージはある

けど、あと面白いのは skip くらいかな。assert と cmp くらいにとどめておくのが、つかず離れずでいいんじゃないだろうか。

はてなで一緒に働きませんか?