Closed10

Meta (Facebook) のバージョン管理ツール Saplingを試してみた

miketako3miketako3

インストール

$ 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
miketako3miketako3

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
miketako3miketako3

Saplingのチュートリアルに従いcloneしてみる

$ sl clone https://github.com/facebook/sapling
$ cd sapling
$ sl
@  6b7c5a62d  Today at 09:21  generatedunixname499836121  remote/main
│  Updating submodules
~
miketako3miketako3

初コミットしてみる

$ 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
│
~

確かに勝手に分岐ができている様に見える

miketako3miketako3

stackを作ってブラウザ上でいじる
Interactive Smart Logというらしい

https://sapling-scm.com/docs/addons/isl

$ 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に慣れてない人とかには結構良いツールかもしれない

miketako3miketako3

Gitとの違い

https://sapling-scm.com/docs/introduction/differences-git

普通に使う上で一番大事そうなのは「ローカルのブランチが非推奨」ということっぽい

以下Google翻訳

Git では、リポジトリはブランチの場所によって定義されるため、ほとんどの場合、作業を行うときは常にローカル ブランチにいる必要があります。さらに、あるブランチに対して行った修正/リベースは、他のブランチには影響しません。

Sapling では、ローカル ブックマーク (Git ブランチに相当) は完全にオプションであり、通常は使用されません。コミットグラフのメインラインから分岐するコミットのスタックを作成できるという意味で「ブランチ」がありますが、それにラベルを付ける必要はありません。すべてのコミットは「スマートログ」で簡単に確認でき、そのハッシュを介してアクセスできます。

ブランチを削除してコミットを削除する代わりに、コミットを「非表示」および「再表示」できます。ブックマークを必要としないことで、リポジトリのメンタル モデルが簡素化され、一般的にユーザーから高く評価されています。ローカル ブックマークは引き続きコミットの便利なラベルとして使用できますが、コミットをリベースすると、すべてのローカル ブックマークがコミットとともに移動することに注意してください。Git の origin/main と同様に、リモート ブックマークは引き続き必要であり、ローカルで不変です。

実際勝手にブランチが切られているので明示的に切る必要は無さそうで、pushするときに以下コマンドで名前を決めるっぽい

sl push --to BRANCH
miketako3miketako3

どうやらブランチ情報とかを一括で取ってこない (必要になったときに取ってくる) とかでモノレポに最適化されているらしい

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.

https://sapling-scm.com/docs/introduction/differences-git

一方でcloneは内部でgitを使っているらしく、どうやってるのか少し気になるところ

For Git support, Sapling uses Git under the hood for clones, pushes, and pulls. Hence the output matches Git.

https://sapling-scm.com/docs/overview/basic-commands#cloning-and-checking-out

このスクラップは2023/07/20にクローズされました