ghqで仕事用と趣味用でディレクトリ分けしてリポジトリ管理しやすくなりました
2020年1月5日追記: v1リリースしました https://songmu.jp/riji/entry/2020-01-05-ghq-v1.html
https://github.com/motemen/ghq
最近のghqの状況と、v1リリースに向けた非互換変更などのアナウンスです。現状の最新のv0.17.4を前提に書きます。
ghq.<url>.root 設定により細やかにclone先を設定可能に
例えば、gitconfig上に以下のように設定すれば、デフォルトでは"~/src/hobby" に、仕事用は"~/src/work"にcloneされます。
[ghq]
root = ~/src/hobby
[ghq "https://github.com/myorg"]
root = ~/src/work
[ghq "https://myvcs.example.com"]
root = ~/src/work
vcs = hg
このghq.<url>.rootの機能と併せて、includeIfでディレクトリ配下固有のgitconfigを読み込ませると有用でしょう。
[includeIf "gitdir:~/src/work"]
path = ~/src/work/.gitconfig
ghqはopinionatedなディレクトリ構成を強制するツールであるため、あまり柔軟なghq.root設定をできるようにしたくありませんでしたが、これは良い落とし所であると思っています。
ghq.rootを複数設定している場合の非互換変更
この変更によりghq.rootを複数設定している場合に意図しない非互換変更が入ったのですが、すみませんが、これを仕様とさせてもらいます。
具体的には、設定ファイル上に複数の、ghq.rootが書かれている場合 後に書かれている方が優先 されるようになりました。
具体的には、以下のようなgitconfigがあった場合、v0.17.0以降で、ghq get
は"~/proj_b"にcloneをおこないます。
[ghq]
root = ~/proj_a
root = ~/proj_b
後に書かれたものが先に書かれた設定を上書きするのは、gitconfig上では自然な挙動なので、それを正しい仕様とさせてもらいます。
複数設定されている皆様はお手数ですが、設定の変更をお願いします。
ghq listの高速化
多くの貢献により、ghq list
がだいぶ高速化されました。ありがとうございます。特に v0.9.0~v0.12.6の間はだいぶ遅いため、アップデートをおすすめします。
また、 ghq list --vcs=git
として、探索とリストアップをgitリポジトリのみに絞り込むことで若干速くなるハック(v0.13.1以降)がありますが、現状(v0.14.2以降)ではvcsオプションを付けなくても、速度差はほとんどありません。
ghq createによるリポジトリ新規作成
ghq create myproj
とすることで、リポジトリを新規作成するようになりました。この場合、僕の環境だと $(ghq root)/github.com/Songmu/myproj
にリポジトリが作られます。内部的にはディレクトリ作成と git init
が実行されます。
コマンド実行完了時に標準出力に作成されたディレクトリパスが出力されるため、それを利用してその後の操作もおこなえます。
ghq create <repository URL>
, ghq create myorg/newproj
の様な指定ももちろん可能です。引数への指定ルールは ghq get <target>
のtargetと同様です。
ghq.<url>.root
や ghq.<url>.vcs
の設定も考慮するので、それらが設定されていた場合、適切なディレクトリパス配下で適切なVCSを使って初期化処理がおこなわれます。
現状の機能はそれだけですが、リポジトリ作成後になんらかの初期化コマンド実行(例えばgodzil newなど)をしたいニーズもあると思うので、そのあたりは何らかの連携方法を考え中です。例えば、引数で追加実行コマンドを与えられるなど。
ghq v1に向けて
オリジナル作者のmotemenさんとも話しましたが、issueも大体捌けて、欲しい機能も大体揃い、使い方も固まってきたため、近いうちにv1をリリースしようと計画しています。
それに伴い、幾つかの非互換変更を入れる予定です。すでにpull requestは作成済みです。これらに関して意見があればぜひお知らせください。
ghq.rootのデフォルト値を"~/ghq"に
https://github.com/motemen/ghq/pull/237
gitconfigにghq.rootが設定されていない場合、ghqは現状"~/.ghq"配下にリポジトリをcloneしますが、隠しディレクトリである必要は無いため、標準を "~/ghq" にとする予定です。
"~/src" 派も多いようで、そちらにするか迷ったのですが、"~/src" は一般的な命名であり、ghq以外の何かとコンフリクトする可能性も考えて、デフォルトにはしませんでした。そのあたりはghq.rootを適切に設定してください。
ghq lookの廃止
https://github.com/motemen/ghq/pull/243
ghq look
は cpanm --look
インスパイアで作られたサブコマンドですが、今は、ghq get --look
で代用できますし、そちらのほうがcpanmの挙動とも近いと言えます。
これを廃止する理由は、意図せぬ利用がされていて、それに伴うハマりどころも多いからです。
ghq look
はあくまでも「一時的なソースコードのチラ見」のための機能なのですが、これを作業ディレクトリの移動に使い、それゆえに意図せぬ挙動が起こってハマっているケースが散見されます。これはもちろん利用者側の問題ではなく、アナウンス不足であり、そのように誤解されやすい機能であるから故に、削除したいという意図です。
ghq look
は子プロセスで別のシェルプロセスを起動して、ディレクトリを移動したように見せかけています。どうしてもそのようにするしかない。
しかしこうすると、シェルの設定がうまく引き継がれなかったり、元のディレクトリに戻るときにexitする必要があるといった直感的でない挙動があります。また、シェルを起動し直すため、シェルの起動時間がかかってしまうという問題もあります。
なので、作業ディレクトリの移動には以下のように、素直にcd
をするのがおすすめです。
% cd $(ghq list --full-path --exact motemen/ghq)
また、多くの人がすでにそうしていると思いますが、pecoやfzfのようなフィルタツールと連携して移動する設定をしておくのが王道だとも思います。
ghq importの廃止とghq getへの機能統合
https://github.com/motemen/ghq/pull/244
表題のとおりです。ghq get
とghq import
は機能が類似しており、ソースコード上も重複が多かったため機能統合することにしました。今までimportサブコマンドを利用していた部分をgetに書き換えるだけで動きます。以下のような具合です。
% cat repolist.txt | ghq get --parallel
ちなみに、v0.11.0で追加した並列取得のための--parallel
オプションが便利です。最大6並列でrepositoryを取得します。
ドキュメント強化
古い情報も散見されるため、改めてまとまったドキュメントを整備したいと考えています。チュートリアルやレシピ集的なものがあるとよいかと思っています。以下のような選択肢を考えていますが、何が良いか迷っているので、ご意見いただけると嬉しいです。
- Repository上にMarkdown等を置く
- GitHub Pages
- GitHub Wiki
ロゴとか欲しい…?
ご意見やフィードバックをお待ちしております
ということで、ご意見やフィードバックをお待ちしております。オンラインサロン「MOTEMEN」 の#goチャンネルでghqの開発について投下していることもあるので興味があればご参加ください。(って僕が宣伝しても良いのかな…?)
また、オリジナル作者のmotemenや僕はGitHub Sponsorも開設しているため、検討してもらえると嬉しいです。