radicle-heartwood-lfs/crates/radicle-cli/examples/git/git-push-force-with-lease.md

3.2 KiB

Here we show that the Radicle remote helper supports the use of --force-with-lease1.

First we will set things up by pushing an initial commit:

$ git commit -m "New changes" --allow-empty -q
$ git push rad master

Now, we will create a new commit, and use the --force-with-lease, which should succeed. In fact, since the current setup ensures that you can only push to your namespace, --force-with-lease should always work! No other person should be able to push to your namespace, and so the commit should never have changed from the last time you pushed.

$ git commit --amend -m "Neue Änderungen" --allow-empty -q
$ git push rad master --force-with-lease
✓ Canonical reference refs/heads/master updated to target commit 9170c8795d3a78f0381a0ffafb20ea69fb0f5b6b
To rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji/z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
 + fb25886...9170c87 master -> master (forced update)

As per the documentation, you can also pass the reference name, as the expected value, to --force-push-lease:

$ git commit --amend -m "Noch mehr Änderungen" --allow-empty -q
$ git push rad master --force-with-lease=master
✓ Canonical reference refs/heads/master updated to target commit 1e4213811eb4ce67360e4a0222cab81ad11a7ffe
To rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji/z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
 + 9170c87...1e42138 master -> master (forced update)

As well as the named reference, and its expected value:

$ git commit --amend -m "Even more changes" --allow-empty -q
$ git push rad master --force-with-lease=master:1e4213811eb4ce67360e4a0222cab81ad11a7ffe
✓ Canonical reference refs/heads/master updated to target commit c4b74ef30953598852a82e0cd22b2ebb0d8d9e18
To rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji/z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
 + 1e42138...c4b74ef master -> master (forced update)

If we try use the same expected value as the last push, it should fail since the reference was updated in the last commit:

$ git commit --amend -m "And even more" --allow-empty -q
$ git push rad master --force-with-lease=master:1e4213811eb4ce67360e4a0222cab81ad11a7ffe
To rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji/z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
 ! [rejected]        master -> master (stale info)
error: failed to push some refs to 'rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji/z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi'

And if we do not supply the commit, it should also fail, since this implies that we expect the reference to not exist:

$ git commit --amend -m "And even more" --allow-empty -q
$ git push rad master --force-with-lease=master:
To rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji/z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
 ! [rejected]        master -> master (stale info)
error: failed to push some refs to 'rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji/z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi'

So, let's create a new branch:

$ git push rad master:dev --force-with-lease=dev:
To rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji/z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
 * [new branch]      master -> dev