Junio C Hamano <gitster@xxxxxxxxx> writes: > Doesn't rsync work the same per-file fashion, and the only reason > why it is a better fit is because it is not continuous, not > attempting to "sync" while the repository is in use, until the user > explicitly says "OK, I am ready to go home, so let's stop working > here and send everything over to home with rsync"? OK, so not "per-file" but "continuous" is the root problem, and "cloud" would be a good word because all the popular ones share that "continuous" trait. This part of the proposed patch text may need rethinking a bit. > +or added files, broken refs, and a wide variety of other corruption. These > +services tend to sync file by file and don't understand the structure of a Git > +repository. This is especially bad if they sync the repository in the middle of That is, "file by file" is not a problem per-se, "don't understand the structure" is a huge problem, and "continuous" may contribute to the problem further. I wonder if you let the "cloud" services to continuously sync your repository, then go quiescent for a while and then start touching the destination, it would be sufficient, though. The refs with funny "2" suffixes and the like are the symptom of two sides simultanously mucking with the same file (e.g ".git/refs/main") and the "cloud sync" could not decide what the right final outcome is, right? I also wonder if we add a way to transfer reflog entries, that imply the object reachability, say "git push --with-reflog", over the wire, it would be sufficient to do everything with Git. Before you go home, you'd do git stash save --untracked && git stash apply git push --mirror --with-reflog --with-stash to save away modified and untracked files to a stash entry [*], and push all the refs with their reflog entries (including refs/stash which normally gets refused because it has only two levels). Side note. If there were a variant of "git stash save" that only saves away without modifying the working tree and the index, I'd use that single command instead of "save and immediately restore by applying" kludge. Then at the destination, you'd figure out what the current branch was (the stash message should record tha name of the branch), check that branch out, and running "git stash pop" will give you pretty much the same environment.