2.6K Views
November 15, 25
スライド概要
Fellow at Henry, Inc. Tech SaaSのPdM、スタートアップ取締役CTOや外資スタートアップのIC等を経て現任。好きな言語はGoとPerlと中国語で雑なOSSを200以上量産している。3 times ISUCON winner. 著書「みんなのGo言語」共著他。Podcast: https://oss4.fun/
ghqのひみつ Masayuki Matsuki a.k.a Songmu @ YAPC::Fukuoka 2025 LT
x-motemen/ghq (3.3k stars) https://github.com/x-motemen/ghq ● Go製のローカルリポジトリ管理ツール ○ ● ● ● ローカルマシンでのリポジトリ管理がとにかく明確になる ghq: リモートリポジトリのローカルクローンをシンプルに管理する - 詩 と創作・思索のひろば 私Songmuは現在ghqのメインメンテナ 作者のmotemenさんを差し置いて発表させてもらいます
ghqは何の略? ● ● YAPC::Fukuokaのテーマが"Q" である以上ghqについて話さざるを得ない ghqの"q" の意味は長らく謎だった ○ ○ ● ● 作者のmotemenさんは九州出身です もしかして九州だった…? gh部分も実は必ずしもGitHubとは限らない 現在の公式見解↓
固有名詞としてのghq ● 参考: 固有名詞をつけるとき - 詩と創作・思索のひろば 日常的に使われたり口に上るものであれば、固有名詞を持っていてもい い。そのたびにコンテキストが強化されていくからだ。ただそれが受け入 れられるにはその対象が「名前負け」していないことを考えてあげないと いけない。Goはやりすぎだけど、定着するだけのパワーがあった。 ecspressoみたいに固有名詞でありつつ中身を示唆している名前を考えら れたら楽しいですね。ghqについてはとくに反省していません。
ghqの誕生経緯や思想
あんちぽっぷさんのghq紹介記事 http://blog.kentarok.org/entry/2014/06/03/135300
発掘しました https://web.archive.org/web/20140701120106/http://blog.kentarok.org/ent ry/2014/06/03/135300
miyagawaさんblogでの紹介 https://miyagawa.co/blog/ghq-peco-percol
古の go get ghq は元々、古の go get の挙動を模倣して作られた。 あとはやっぱりGoで書くのでGoのソースコードは読みましたね。go getコマンドのソースコードを読んだときにGit以外のバージョン管理 ツールにも対応していて、それを真似しようと考えたんです。Mercurial は僕は全然使わないんですけど、機能としては面白いと思って作りまし たね。 -- https://en-ambi.com/itcontents/entry/2018/02/28/110000/
Goの $GOPATH 時代 ● 各外部ソースコードリポジトリから直接ライブラリを取得していた ○ ● Git以外のVCS (Version Control System) にも対応 ○ ○ ○ ○ ● $GOPATH/src 以下に配置 Mercurial Bazaar Fossil Subversion ghq 利用者は ghq.root と $GOPATH/src を揃えるのが定番だった
Go ModuleとGOPROXYの登場 ● ライブラリを $GOPATH 配下に配置しなくなった ○ ● モジュールの取得も標準では proxy.golang.org という GOPROXY 経由に ○ ○ ● 複数バージョンが共存可能になりバージョンロックもやりやすくなった 取得の高速化や耐サプライチェーンアタック信頼性 proxy.golang.org 実質gitのみサポート ■ 取得先のURLが全てgitリポジトリとなったため プロキシを経由しないモジュールの直接取得は可能 ○ ○ この場合はgit以外のVCSも利用可能 ただし、gitとhg以外については GOPRIVATE 設定か GOVCS 設定が必要 ■ セキュリティ上の理由 ■ 外部コマンドの利用や利用頻度の少なさ
ghqも ghq get であらゆるリポジトリを ゲットできる ● ● ● 実はGitHubやgitだけではない 各コマンド体系を覚えずとも ghq get で全部clone出来て便利 GoがサポートしているGit, Mercurial, Bazaar, Fossil, Subversionに加 え、以下のVCSもサポート ○ ○ ○ ○ git-svn darcs pijul (CVS)
ghqのインテグレーションテスト 色々なリポジトリを実際に ghq get して動作を確認している
ghqがサポートしているVCSたち
Git 2005年 ~ https://git-scm.com/ ● ● Linus TorvaldsがLinuxカーネル開発で使う為に開発 Linuxは元々BitKeeperというVCSを使っていた ○ ● ライセンス問題などがあり、gitを開発して乗り換え GitHub や GitLab などのホスティングサービスが有名
Apache Subversion (svn) 2000年 ~ ● ● 集中型バージョン管理システム 2007, 8年頃は広く使われていた ○ ● Apache HTTP Serverは今もSubversionで管理されている ○ ● ● 当時はCVSやVSSからSubversionへ大体切り替わり終わったような時期 ■ 次はGitが来るのかな…? みたいな予感を感じつつあった頃 ● まさかGitがここまで長く覇権をとるとは Ruby言語は令和になってから(2019年) Gitに移行 GitHubには昔Subversionリポジトリ機能があった CodeReposもSubversionでしたね
CVS (Concurrent Version System) 1990年 ~ https://www.nongnu.org/cvs/ ● ● 古のバージョン管理システム ghqでは限定的サポート ○ ○ ghq get での取得サポートはしていない ghq root 以下に CVS リポジトリがある場合は ghq list で一覧はされる
git-svn https://git-scm.com/docs/git-svn ● ● ● Perl製 Subversionリポジトリをgitクライアントで操作可能にするGit公式ツール Gitへの移行期にSubversionリポジトリをgitクライアントで操作するため に使われた ○ 私の初めてのコマンドラインでのバージョン管理ツールは git-svn
Mercurial (hg) 2005年 ~ https://www.mercurial-scm.org/ ● ● ● python製 次世代分散VCSとして、Gitと覇権を争った Bitbucket というホスティングサービスが有名 ○ ただし2020年にMercurialサポートは終了してGitのみに
Bazaar (bzr) 2007年 ~ https://launchpad.net/bzr ● ● ● python製 Ubuntuの開発で有名なCanonical社が支援していた Launchpad というホスティングサービスがある ○ ○ ● EmacsやMySQLなどもBazzarで管理されていた時期がある ○ ● Ubuntuのソースコードもここにホスティングされている (ただしGit repoだが) 今年Bazaarサポート終了 今はGitに移行 breezy (brz) という後継プロジェクトが存在する ○ https://www.breezy-vcs.org/
Fossil 2006年 ~ https://fossil-scm.org/ ● SQLite のソースコード管理に使われている ○ ● バリバリ現役 何ならFossilのデータストアはSQLiteデータベースになっている ○ カッコいい
Darcs 2003年 ~ https://darcs.net/ ● ● Haskell製 Haskell関連の多くのOSSはDarcsで管理されていた ○ ○ ● http://darcs.haskell.org/ghc, http://darcs.haskell.org/pandoc 等 現在はGitに移行 darcs hub というホスティングサービスがある
Pijul 2016年 ~ https://pijul.org/ ● ● ● Rust製 思想的にはDarcsの理論を受け継いでいる 操作体系はGitやMercurial等の影響を受けている
(おまけ) ghq非サポートのVCSいくつか
Piper 2012年 ~ ● ● Googleの社内VCS Piper (source control system) ○ Google社の超巨大なモノレポでの分散システム開発を支えていると言える
Perforce 1995年 ~ https://www.perforce.com/ ● ● ● 大規模開発向けの商用VCS Google社は元々はPerfoceを使っていた スクエアエニックス社のFINAL FANTASY XVI開発などでも使われている ○ 参考: 大規模ゲームの開発をより効率的に、『FINAL FANTASY XVI』に向けた開発環境の 取り組み~CEDEC2023(2)
Sapling (sl) 2022年 ~ (OSS化) https://sapling-scm.com/ ● ● Meta社が社内で使っている(?) Git互換の大規模リポジトリ向けVCS sl コマンドで操作するのが面白い
Jujutsu (jj) 2020年 ~ https://jj-vcs.github.io ● ● ● Rust製 Git互換を目指した新しいVCS 最近目にするようになってきた
色々なVCSがありますね!
(宣伝) ghq-handbookを読もう!(買おう) もっと色々なひみつを知れるかも。 ● ghq handbook ○ ○ ● https://leanpub.com/ghq-handbook https://zenn.dev/songmu/books/ghq-handbook GitHub Sponsor ○ https://github.com/sponsors/Songmu GitHub Sponsorも歓迎です!