Meta (Facebook) のバージョン管理ツール Saplingを試してみた
概要
こんな記事が公開されていて気になったのでどんなもんか試してみた
環境
MacBook Air (M1, 2020)
macOS Monterey (12.6)
インストール
$ curl -L -O https://github.com/facebook/sapling/releases/download/0.1.20221118-210929-cfbb68aa/sapling_0.1.20221118-210929-cfbb68aa.arm64_monterey.bottle.tar.gz
$ brew install ./sapling_0.1.20221118-210929-cfbb68aa.arm64_monterey.bottle.tar.gz
Preztoのせいでlsのエイリアスとしてslが入っていて一瞬詰まった……
これに書かれたファイルの該当行をコメントアウトして外した
Github CLIがあった方が良いとのことなのでこれも入れる
$ brew install gh
$ gh auth login --git-protocol https
こんな感じで回答
? What account do you want to log into? GitHub.com
? Authenticate Git with your GitHub credentials? Yes
? How would you like to authenticate GitHub CLI? Login with a web browser
! First copy your one-time code: XXXX-XXXX
Press Enter to open github.com in your browser...
✓ Authentication complete.
- gh config set -h github.com git_protocol https
✓ Configured git protocol
✓ Logged in as miketako3
Saplingのチュートリアルに従いcloneしてみる
$ sl clone https://github.com/facebook/sapling
$ cd sapling
$ sl
@ 6b7c5a62d Today at 09:21 generatedunixname499836121 remote/main
│ Updating submodules
~
初コミットしてみる
$ touch hoge.txt
$ sl add .
adding hoge.txt
$ echo 'Hello, World!' >> hoge.txt
$ sl commit -m 'my first commit with Sapling'
$ sl
@ 3111b0479 5 seconds ago contact
╭─╯ my first commit with Sapling
│
o 6b7c5a62d Today at 09:21 remote/main
│
~
確かに勝手に分岐ができている様に見える
stackを作ってブラウザ上でいじる
Interactive Smart Logというらしい
$ echo foo > foo.txt ; sl add foo.txt ; sl ci -m 'adding foo'
$ echo bar > bar.txt ; sl add bar.txt ; sl ci -m 'adding bar'
$ echo baz > baz.txt ; sl add baz.txt ; sl ci -m 'adding baz'
$ sl
@ 94972ce89 6 seconds ago contact
│ adding baz
│
o b40e2075e 11 seconds ago contact
│ adding bar
│
o 8e7c66bf8 17 seconds ago contact
│ adding foo
│
o 3111b0479 105 seconds ago contact
╭─╯ my first commit with Sapling
│
o 6b7c5a62d Today at 09:21 remote/main
│
~
$ sl web
started a new server
access Sapling Web with this link:
http://localhost:3011/?token=XXXXXXXXXXXXXXXXXX
こんな画面が表示される
コミット内容を確認したり、コミットをまとめたり、ドラッグアンドドロップで枝分かれさせたりできる
Gitに慣れてない人とかには結構良いツールかもしれない
Gitとの違い
普通に使う上で一番大事そうなのは「ローカルのブランチが非推奨」ということっぽい
以下Google翻訳
Git では、リポジトリはブランチの場所によって定義されるため、ほとんどの場合、作業を行うときは常にローカル ブランチにいる必要があります。さらに、あるブランチに対して行った修正/リベースは、他のブランチには影響しません。
Sapling では、ローカル ブックマーク (Git ブランチに相当) は完全にオプションであり、通常は使用されません。コミットグラフのメインラインから分岐するコミットのスタックを作成できるという意味で「ブランチ」がありますが、それにラベルを付ける必要はありません。すべてのコミットは「スマートログ」で簡単に確認でき、そのハッシュを介してアクセスできます。
ブランチを削除してコミットを削除する代わりに、コミットを「非表示」および「再表示」できます。ブックマークを必要としないことで、リポジトリのメンタル モデルが簡素化され、一般的にユーザーから高く評価されています。ローカル ブックマークは引き続きコミットの便利なラベルとして使用できますが、コミットをリベースすると、すべてのローカル ブックマークがコミットとともに移動することに注意してください。Git の origin/main と同様に、リモート ブックマークは引き続き必要であり、ローカルで不変です。
実際勝手にブランチが切られているので明示的に切る必要は無さそうで、pushするときに以下コマンドで名前を決めるっぽい
sl push --to BRANCH
普通にBetter Gitとして使えそうなのでしばらく試してみるのも良いかもしれない
困った時はここに立ち返ればコマンドは確認可能
どうやらブランチ情報とかを一括で取ってこない (必要になったときに取ってくる) とかでモノレポに最適化されているらしい
In Git, a clone or pull will generally fetch all new repository data.
In Sapling, a clone or pull will only fetch the main branches of a repo. Other branches will be fetched on demand. push only updates one remote branch. When used with a supported server, Sapling might fetch commit data (messages, date, or even hashes), tree and file data on demand. These avoid downloading unnecessary data, at the cost of requiring the user to be online more often.
一方でcloneは内部でgitを使っているらしく、どうやってるのか少し気になるところ
For Git support, Sapling uses Git under the hood for clones, pushes, and pulls. Hence the output matches Git.