便利な「git-サブコマンド」を作成する

  • 46
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

今まで知らなかったのですが、git-subcommand といった名前の実行ファイルをパスの通ったディレクトリに置いておくと、

$ git subcommand

といったように、ハイフンなしで実行できます!(便利そう)

オレオレサブコマンドでもこの命名規則で登録しておけば、通常の git コマンドと同じような感覚で利用できとても捗ります。

よってこの記事では、他のリポジトリでもよく見かけるようなサブコマンドや、今回自作したサブコマンドなどを紹介していきます。

自作した git サブコマンドは筆者の dotfiles リポジトリに置いてあります。

今回以下に紹介するサブコマンドは bash で書いていますが、Ruby でも Python でも、何なら C や Go で書いても OK です。

git undo

#!/bin/bash
git reset "${1:---soft}" HEAD^

最新のコミットを取り消します。単に git undo とすれば、ステージング後に戻し、git undo --hard とすればステージングする前の状態かつファイル編集すらもなかったことにします。ここらへんは git reset の使い方を調べてください。git undo はそのエイリアスのようなものです。

git get

#!/bin/bash

# Check arguments
if [[ -z $1 ]]; then
    echo "too few argument" 1>&2
    exit 1
elif [[ ! $1 =~ ^(((https?|git)://)?github.com/)?[A-Za-z0-9_-]+/[A-Za-z0-9_-]+(\.git)?$ ]]; then
    echo "$1: invalid github.com URL" 1>&2
    exit 1
fi

# Format username/reponame
uri="$(echo "$1" | perl -pe "s/^((https?|git):\/\/)?(github\.com\/)?//;s/\.git$//")"
username="${uri%/*}"
reponame="${uri#*/}"

# Destination
dest="${2:-$HOME/src/github.com/$username}"
if [ -d "$dest" ]; then
    dest="$dest/$reponame"
fi

# Make dir
mkdir -p "$dest" 2>/dev/null
if [ $? -ne 0 ]; then
    echo "$dest: cannot create directory" 1>&2
    exit 1
fi

# Run
git clone "https://github.com/${uri}.git" "$dest"

git clone を簡単にするやつです。わかりやすく名前も git get にしました。git clone は https:// から始まる URL を渡しますがタイピングが面倒なので、ユーザ名とリポジトリ名だけで OK にしています。またクローン先もよしなにやってくれるようにしました。ghq に影響されているため、デフォルトでのクローン先は Go 言語のお作法に習ったそれです。

git extras

たくさんあるので、これらをまとめたリポジトリは無いのかと調べたら案の定ありました。