this post was submitted on 25 Oct 2024
18 points (95.0% liked)

Programming

17266 readers
219 users here now

Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!

Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.

Hope you enjoy the instance!

Rules

Rules

  • Follow the programming.dev instance rules
  • Keep content related to programming in some way
  • If you're posting long videos try to add in some form of tldr for those who don't want to watch videos

Wormhole

Follow the wormhole through a path of communities [email protected]



founded 1 year ago
MODERATORS
 

Hi programmers,

I work from two computers: a desktop and laptop. I often interrupt my work on one computer and continue on the other, where I don't have access to uncommitted progress on the first computer. Frustrating!

Potential solution: using git to auto save progress.

I'm posting this to get feedback. Maybe I'm missing something and this is over complicated?

Here is how it could work:

Creating and managing the separate branch

Alias git commands (such as git checkout), such that I am always on a branch called "[branch]-autosave" where [branch] is the branch I intend to be on, and the autosave branch always branches from it. If the branch doesn't exist, it is always created.

handling commits

Whenever I commit, the auto save branch would be squashed and merged with the underlying branch.

autosave functionality

I use neovim as my editor, but this could work for other editors.

I will write an editor hook that will always pull the latest from the autosave branch before opening a file.

Another hook will always commit and push to origin upon the file being saved from the editor.

This way, when I get on any of my devices, it will sync the changes pushed from the other device automatically.

Please share your thoughts.

top 28 comments
sorted by: hot top controversial new old
[–] MajorHavoc 6 points 8 hours ago (1 children)

I set that up, once. It went poorly for me. Git behaves much better, for me, when used thoughtfully and manually.

What I now do instead, is work on certain projects on an SSH accessible host. This gives the same benefits of having my last state easily accesses, without causing noise in my development tools such as git.

[–] [email protected] 1 points 46 minutes ago

If working on Linux, combine SSH with tmux (and the attach/detach commands) and you have a very solid workflow. Learning tmux has been one of the best tools of the year for me.

[–] [email protected] 18 points 12 hours ago (2 children)

Write code on a machine you can remote into from each computer? Less commits, possibly less reverts, less chance of forgetting to git pull after switching machines…idk.

[–] [email protected] 5 points 12 hours ago (2 children)

Don't even need to remote in to anything, just store your working code on a network share

[–] [email protected] 2 points 11 hours ago
[–] [email protected] -3 points 11 hours ago (1 children)

I mean... That's kinda what git does, in a way... Right?

[–] [email protected] 4 points 9 hours ago* (last edited 9 hours ago)

Don't think git as a sync storage, more like to merge works.

If you need to share files between computers use a shared storage.

Always use the right tool for the job. Mount a shared storage or use synctools rsync, etc

[–] [email protected] 1 points 11 hours ago

I have considered this approach, but there are several things I had issues with.

  • there is still a degree of latency. It's not a deal breaker, but it is annoying
  • clipboard programs don't work. They copy to the remote host's clipboard. I bet there's a solution to this, but I couldn't find it from spending a limited time looking into it.
  • in the rare case the host is unreachable, I am kinda screwed. Not a deal breaker since its rare, but the host has to be always on, whether the git solution only requires it to be on when it syncs

To address the issues you brought up:

  • less commits: this would be resolved by squashing every time I make a commit. The auto save commits will be wiped. If I really hated commits, I could just amend instead of commit, but I rather have the history.
  • forgetting to git pull: the hooks I talked about will take care of that. I won't have to ever worry about forgetting anymore.
[–] [email protected] 2 points 8 hours ago

I have a very similar script. I basically have one branch that's only manual commits and a "sister branch" that includes all manual commits plus some automatic ones. I determine what is auto-committed based on a simple test script. The test might be as simple as, "Did it build without errors? Commit."

[–] [email protected] 7 points 12 hours ago (1 children)

Git doesn't need to have a single pull source. It's probably worth just configuring the visibility on each machine so you can do peer pulls.

I don't hate the idea of autocommitting in that scenario, though.

[–] [email protected] 2 points 10 hours ago (1 children)

Sorry, but I'm not really following here. Do you mean like git add remote and have another remote? What would the source be?

[–] sip 4 points 10 hours ago (1 children)

your machines

git add remote laptop ...

[–] [email protected] 2 points 10 hours ago (1 children)

That would require my machines to be git servers, right? And hence they should also be on, right? Or am I missing something? Most of the time, my laptop is shut off.

[–] [email protected] 4 points 10 hours ago

It's no worries - most people don't realize this but every git repository is, well, a fully functional git repository. Git shell runs over ssh so as long as your machines have sshd running you should be good.

https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server

[–] [email protected] 1 points 8 hours ago

Post commit hook to push + always squash on merging feature branches

[–] [email protected] 1 points 8 hours ago

Syncthing or unison might be what you want

[–] Matty_r 1 points 9 hours ago

I used to have a similar situation, I used Vscode remote development to effectively work from any machine. Another thing I tried was using Nextcloud to watch the working directory, which automatically synchronized files when they change.

[–] [email protected] 2 points 11 hours ago* (last edited 11 hours ago)

I do this on NixOS. I have a NAS at home where I store most of the files I work on. My computers are internally immutable and almost all the files that change reside solely on the NAS as NFS shares. All of my computers are configured to auto-mount one of its folders at boot. NixOS sees that as an internal drive.
Then, simply navigate to the project folder where I have a flake and a .envrc file containing the command use flake .which will make direnv use Nix to provision the dependencies automatically. Whenever I save, those changes are reflected on all computers.

I like to also version control everything using git and this method allows that transparently.

The only part that I am missing is getting the permissions to align between all computers accessing that same folder. Sometimes I have to create a temp folder that uses rsync to keep up with any changes. If anyone has any pointers, I’m all ears. It rarely gets in my way but does rear its head sometimes. Otherwise, this setup is perfect when I’m at home.

[–] [email protected] 2 points 12 hours ago (2 children)

I just manually push and it's fine. Or as the other commenter says, use a single remote machine.

[–] Mihies 1 points 8 hours ago (1 children)

A remote machine might not be always possible, such as when you develop mobile apps or when you have more than one monitor available. Sadly all options have problems. And (auto) pushing is not an option when you work on a team project where pushing non compilable code is not a welcome option.

[–] [email protected] 1 points 8 hours ago

Remote file system then?

[–] [email protected] 1 points 11 hours ago

Two issues with manual pushing that I have:

  • you have to remember to push
  • you either get more commits than you need, or you have to do extra work to either clean up or put them in separate branches
[–] GetOffMyLan 1 points 10 hours ago* (last edited 10 hours ago) (1 children)

Honestly I would just commit your in progress work then on the other machine check it out and reset to the previous commit.

Then you have your in progress work on the new machine with no random commits.

You could set up an alias that does commit with message "switching machines" and pushes.

Similar have one that pulls and resets.

[–] [email protected] 2 points 10 hours ago

That doesn't solve the problem of forgetting :(

I could train myself to get in the habit, but maybe auto saving is easier, no?

[–] [email protected] 1 points 11 hours ago

I have a script that runs every 5 mins that does a robocopy for each local repo to OneDrive, excluding all the git system files. I don’t really like the idea of pushing half-finished / broken code.

Rarely need to actually copy stuff back out of onedrive, but it’s good enough on the few occasions I forget to push before changing machines.

[–] drew_belloc 1 points 11 hours ago (1 children)

You could also use syncthing so when you are conected to your lan you work folder will always be synced from one pc to another, that way you won't have a bunch useless commits on git and you can still commit and push the changes from any computer

[–] [email protected] 1 points 11 hours ago (1 children)

When I looked into solutions, I thought of syncthing, but read comments from people saying they had issues with this approach, especially regarding the .git directory

[–] [email protected] 1 points 9 hours ago* (last edited 9 hours ago)

Sorry what issues? I'm using syncthing to sync between a macos laptop, a macos vm, and my main linux desktop. I sync my projects folder with a lot of git repos. Maybe I've been lucky so far but no issues with syncthing and git so far

It's really like magic sometimes