git checkoutを禁止してgit switch/restoreに慣れる

こんにちは!ウィルゲート開発室 開発基盤ユニット マネージャー池添です。

皆さん、git使ってますか?gitといえば色々出来る便利コマンドcheckoutですが、これを使用出来ないようにするための方法を紹介していきます。 ちなみに、このネタは社内LT会ように突貫で作ったものなので、生暖かく見ていただけると幸いです。

背景

そもそもなぜ git checkout を禁止するのか、ですがgit 2.23から git checkoutgit switchgit restore に機能が分離されました。 これは git checkout に機能が多くあり、初学者にとって覚えづらいという問題があったため、ブランチ操作は git switch にファイルのリストア操作は git restore に分離されることになりました。

既存である git checkout も残るため git checkout で使い慣れてる方はいままで通り git checkout を使うことも可能です。

github.blog

なぜ禁止するのか

git checkout は今まで通り使えるので、特段今までと使い方を変える必要性はないです。 ですが、逆に今まで通り使えてしまうがゆえに、新しいコマンドである git switch を覚えづらいという問題もあります。

そこで、 git checkout を実行したときに、 git switch を使うようにエラーが表示されれば、 git switch を使うようになり覚えるのではないかと思いました。 (ちなみに git restoregit status を実行した際のリストア操作の説明にちゃんと git restore を使って操作出来る旨が書いてあるので、個人的に覚えやすいと思っています。)

git aliasで禁止にする

git には alias という仕組みがあります。私は git checkout と入力するのが面倒だったので git ch で実行出来るように alias を作成していました。

# ~/.gitconfig
[alias]
  ch = checkout

もともとgit aliasでcheckoutを使っていた人はここを書き換えることで簡単に禁止にすることが出来ます。

# ~/.gitconfig
[alias]
  ch = !echo "git switch/restore をつかってね!"
$ git ch .
git switch/restore をつかってね ! 

このように git ch を実行したときに switch/restore を実行するように警告を出す事ができました。

ですが、この方法はもともとaliasを作っていてそのaliasに慣れてた人に限ります。

標準の checkout コマンドを使い慣れてる人だとaliasに慣れる必要がありswitchコマンドに慣れるのと同等のコストがかかります。

gitコマンドのラッパーを作る

git aliasでは標準コマンドそのものに対してaliasを作ることはできません。(aliasではないですからね)

そこでgitコマンド自体のラッパーを作り、gitではなくbashなどのaliasに登録する事で実行出来ないようにしてみました。

# ~/git.sh
#!/bin/bash -eu

function git {
    # checkoutコマンドのとき
    if [ "$1" = "checkout" -o "$1" = "ch" ]; then
        if [ -e $2 ]; then
            # restore操作のとき
            echo "Restore operations using the git checkout command are not recommended.";
            echo ' use "git restore '$2'"';
            return;
        fi;
        echo "Branch operations using the git checkout command are not recommended.";
        echo ' use "git switch '$2'"';
        return;
    fi;
    # checkout 以外のとき
    command git $@;
}

git $@

# ※このスクリプトは簡易的に作ったものであり、すべての動作を担保しているものではありません。
# 既知の不具合としてgit commit -m "hoge"などの引数に文字列を渡す物が正しく動作しないことを確認しています。

このようなラッパースクリプトでcheckoutコマンドを実行時に警告を出すようにします。

そしてこのラッパースクリプトを~/.bashrcなどに登録します。

# ~/.bashrc
・・・(略)
alias git='~/git.sh'
$ git checkout main
Branch operations using the git checkout command are not recommended.
 use "git switch main"

このように git checkout のときにも git switch を使うように促す警告文を出すことが出来ました。

まとめ

git checkout を禁止して git switch あるいは git restore のコマンドを推奨する方法を二種類紹介しました。

一つはgitのaliasを使ったやり方で、もう一つはgitコマンドのラッパースクリプトを作成しbashなどのaliasにgitコマンドとして登録するやり方を紹介しました。

もともとは社内のLTネタとして作ったものですが、みなさんのgit checkout脱却のために少しでも役に立てれば幸いです。