ghq list の vcs オプションとその有効な使い方

f:id:msh5_h:20190515230652p:plain

先日 ghqv0.11.1 がリリースされました! このバージョンより ghq list コマンドに --vcs オプションが追加されています。🎉

$ ghq list --help
NAME:
    list - List local repositories

USAGE:
    ghq list [-p] [-e] [<query>]

(省略)

OPTIONS:
    --exact, -e      Perform an exact match
    --vcs value      Specify VCS backend for matching
    --full-path, -p  Print full paths
    --unique         Print unique subpaths

この機能は私が1年ほど前に提案したもので、最近になって開発者の方からフィードバックを頂いたことを受けて、PR を作成して master に取り込んで頂いたという流れになります。💪

Feature request: specify vcs argument on `ghq list` · Issue #94 · motemen/ghq · GitHub

例えば --vcs git といったように指定すると、Git の作業ディレクトリのみをリストアップすることができます。あなたが過去に SubVersionMercurial のプロジェクトを ghq get したことがあっても、その実行結果には含まれません。

vcs オプションの value として使用可能なキーワードは、README のこの辺りやソースコードのこの辺りを見ればいいんじゃないかと思います。

Accepted values are "git", "github" (an alias for "git"), "subversion", "svn" (an alias for "subversion"), "git-svn", "mercurial", "hg" (an alias for "mercurial"), and "darcs".

GitHub - motemen/ghq: Remote repository management made easy

var vcsRegistry = map[string]*VCSBackend{
    "git":        GitBackend,
    "github":     GitBackend,
    "svn":        SubversionBackend,
    "subversion": SubversionBackend,
    "git-svn":    GitsvnBackend,
    "hg":         MercurialBackend,
    "mercurial":  MercurialBackend,
    "darcs":      DarcsBackend,
    "fossil":     FossilBackend,
    "bzr":        BazaarBackend,
    "bazaar":     BazaarBackend,
}

ghq/vcs.go at v0.11.1 · motemen/ghq · GitHub

私はこの機能を使って、ローカルの全 Git リポジトリに対して git gc をかけてます。 この処理はワンライナーでこう書けます。

ghq list --full-path --vcs=git | xargs -I{} sh -c 'echo {}; git -C {} gc --aggressive'

これを cron に仕込むなどして日次実行するようにしておけば、ヒストリーの長いプロジェクトだったりブランチを多数抱えていても、最適化がかかってディスクサイズが減らせますし、Git 実行時に不定期で始まる GC もオフにできます。😎

※ 私はこういった意図しない処理が走って時間がかかる(Homebrew の自動アップデートとか)のが苦手なので、どちらかと言えば後者の目的でやってますね!

git config gc.auto 0