Top
Best
New

Posted by tigerlily 2 days ago

jj – the CLI for Jujutsu(steveklabnik.github.io)
482 points | 423 commentspage 3
waynecochran 2 days ago|
Anything new or special in jj that allows me to work with large binary files simply? To me, this is still unsolved in terms of providing an elegant solution (e.g. things like Git Large File Storage (Git LFS) are awkward).
brendoncarroll 2 days ago||
I've heard that jj has support for non-git backends? Can anyone comment on how difficult it would be to add support for another backend, any docs or examples?

I have a project[0] that does the large file thing well, but is missing most of the version control porcelain. I've been looking for the path of least resistance to integrate it into something with a larger user base.

[0] https://github.com/gotvc/got

steveklabnik 2 days ago||
To add a new backend, there's a trait that you implement for your backend: https://github.com/jj-vcs/jj/blob/713a0d0898448392d38fdcbaba...

I suspect if you came by the jj discord, folks could help you with more detail than that.

brendoncarroll 2 days ago||
Thanks for the link.

It looks like this treats files as blobs just like Git, and trees as single objects which fit in memory. Assuming that is a correct understanding, this core abstraction would need to change to handle large files and directories well.

All the well known version control systems do this though, and it simplifies the system significantly. It's the right model for source code, but it doesn't translate well to arbitrary data.

steveklabnik 2 days ago||
Yes, it will require work to do large files well. But there is general interest in upstream in having that, there's just nobody driving the work at the moment.
steveklabnik 2 days ago||
Not yet. It's desired to do something better here, but there's no active development that I'm aware of right now.

(LFS support is in progress though)

qezz 2 days ago||
For those, who want to/need to keep some files uncommitted, the workaround I found is to put gitignore into some nested directory:

  mkdir junk
  echo '*' > junk/.gitignore
jj won't track those files under ./junk/

Also might be relevant for claude, since it wants to put its settings into the repo itself as `.claude/`:

  mkdir junk/.claude
  bwrap ... --bind "$(pwd)/junk/.claude" "$(pwd)/.claude" ...
For some more common files, I use global gitignore file as

  # ~/.gitconfig
  [core]
    excludesFile = ~/gitconf/gitignore_global

  # ~/gitconf/gitignore_global
  .envrc
  .direnv/*
BeetleB 2 days ago||
You can also set snapshot.auto-track to tell it not to track certain files.

Another option is to make a branch with the files that you want to keep around but not push (e.g. stuff specific to your own tooling/editor/IDE), and mark that branch as private. Private commits (and their descendants) can't be pushed.

You then make a merge commit with this branch and main, make your changes, etc. You will have to rebase before pushing so that your branch isn't a descendant of the private commit.

This will involve more work, but it has the benefit that you're actually version controlling your other files.

tcoff91 2 days ago||
I run jj in colocated mode so I put stuff in .git/info/exclude if I want it ignored but not part of the main .gitignore
tracker1 2 days ago||
Seems interesting, but tbf, I only really use a small subset of git commands as it is... I've tended to practice a few workflows that just reduce the overhead and risk for conflicts.
swoorup 2 days ago||
I love jj, but mostly I use jjui.

I would like more uniformity in the way jjui handles commands when you are viewing changes vs when you are viewing files within a single change.

Often I just make my changes and leave it there without `new`, as I am not sure which file should go in a single commit. I just leave it there and I interactively commit later.

For me to use `new` more, I would like the ability to also simply be able to get a tree view of all changes, which contains file which contains file changes, so I could can have marks that span multiple changes and then either `split` or `commit` or `squash` the change, idk if there is a good word for it. Right now I can only mark within a single change, and I lose it once I navigate up.

joshka 2 days ago||
I use jj fairly regularly and I'm trying to understand what your approach means, but having difficulty following what you want to acheive here. Seems like you're using ambiguous language that isn't aligned - wdym by marks?
gcr 2 days ago|||
In jjui, you can select multiple changes to squash/rebase by pressing space bar before pressing S or r. Is that what you mean?
swoorup 2 days ago||
yes exactly, pressing space bars to select them. I referred these selection as marks.
nchmy 2 days ago||
yeah, i know almost nothing about jj because i only use it via jjui. Why would I waste brain power learning about and remembering new incantations when I can just browse around with arrow keys and mouse and then use like 9 hotkeys to do everything that I could possibly need?
theappsecguy 2 days ago||
I'm still struggling most with the fact that my day-to-day work involves a git first platform like GitHub.

Although jj as a vcs system, it does feel better, working with git through it still feels like a chore, but to be fair I only gave it a day before going back to git.

Does anyone have any good resources on how to augment a git flow through the lens of a git hosting platform to work smoothly and still reap the benefits of jj?

r5Khe 2 days ago||
I'm not sure what the hangup is, TBH. I use `jj` with GitHub and ADO every day, and it works great.

What specific challenges are you running into that make it feel like a chore?

theappsecguy 2 days ago||
Hmm, it was a while back so now I'm struggling to recall, but I remember feeling like I'm going against the grain of easily using GitHub. I followed this exact tutorial at the time and it looks like there are now sections on how to work with GitHub.

Perhaps I need to force myself to commit for longer...

BeetleB 2 days ago||
What problems are you running into?

The jujutsu docs have a page for this - it has everything I needed.

https://docs.jj-vcs.dev/latest/github/

rattray 2 days ago||
Has anyone tried both jj and gitbutler extensively yet? Both seem to have some interesting new ideas on top of git.
ymir_e 2 days ago|
I was hoping someone else had written about it here.

From my knowledge there are three different takes on git being worked on which looked interesting. - JJ - GitButler - Zed

Zed version system doesn't have that much public info yet, but they wanted to build a db for storing code versions for AI agents. Not sure if this is still the direction, and I'm a bit skeptical, but interested to see what they come up with.

Even though git works well enough, I'm certain there will be another preferred way at some point in the future. There are aspects of git that are simply not intuitive, and the CLI itself is not up to standard of today's DX.

tobinfricke 2 days ago||
Here are some notes on Jujutsu from Evan Martin that I found interesting/useful:

https://neugierig.org/software/blog/2025/08/jj-bookmarks.htm...

ferfumarma 2 days ago||
Can jj iterate through a list of repositories and clone them all to local storage?

It isn't very hard to make a bash script to do it, but I have about six github repos, all of which frequently need to be put on a new machine. that kind of functionality would be cool to have out of the box.

hosteur 2 days ago||

    for url in url1 url2 ..; do git clone $url; done
That’s not really a script but a basic one liner.
Filligree 2 days ago||
No, but to be honest, why would you want it to? That's... well, you already showed the trivial one-liner.
saghm 2 days ago||
Are you accessing these boxes via ssh or using them directly? If it's via ssh, I'd expect that you would already be using the clipboard for copying the names of them rather than typing them out manually, at which point copying `git clone <a> && git clone <b> && ...` would achieve the same thing.
rob74 2 days ago||
Still not finished unfortunately :( Guess Steve is currently busy writing the next big thing in programming languages (https://steveklabnik.com/writing/thirteen-years-of-rust-and-...) ?
BeetleB 2 days ago||
To be honest, while Steve's tutorial was what got me interested in jj, other tutorials were better in actually helping me understand it.
steveklabnik 2 days ago||
This is why I'm glad we have many of them! Not everyone is going to resonate with my writing style.
BeetleB 2 days ago||
Yes, but it's a sad state of affairs that the official jj docs point to your tutorial, which is incomplete (and IIRC, more incomplete than in the past - I think you took down some topics).
steveklabnik 2 days ago||
Nope, I haven't taken anything down. I have merged in some contributions from others though, it's actually grown (Manish, iirc, contributed the Gerrit section).
BeetleB 2 days ago||
Oh, OK. Must be a bad memory. I often go to your tutorial looking for something I could have sworn I read over a year ago and not find it. I must have read it elsewhere.
steveklabnik 2 days ago|||
Nope, I have had zero time for personal projects lately, Rue is on the backburner until I do.

I've been busy at https://ersc.io/ (and spending time with my family, and playing Marathon...)

surajrmal 2 days ago||
It hasn't been touched in 3 months: https://github.com/rue-language/rue .
alunchbox 2 days ago|
So glad to see this on HN, here to support it. JJ is amazing, the hardest hurdle was not the tool but the toolchain and ecosystem when I started ~ 2 years ago. It's grown rapidly and is incredible to see the community grow!
More comments...