12个版本 (6个破坏性更新)

0.7.1 2023年10月22日
0.7.0 2023年9月22日
0.6.0 2022年10月10日
0.5.0 2022年1月15日
0.1.1 2021年5月30日

#60开发工具

Download history 113/week @ 2024-07-27

每月113次下载

MIT许可证

125KB
3K SLoC

git-nomad

Coverage Documentation Issues Latest Release Commits since latest release License

轻量级同步工作区中的git分支。动机

  • 你经常在多台机器上使用相同的仓库,例如笔记本电脑和台式机。
  • 你经常重写历史并使用只有你自己能看懂的短分支名,这使得将常规分支推送到git远程仓库变得繁琐。
  • 你想要拥有git克隆的所有效率和同步优势,这意味着外部同步工具如Dropbox或网络挂载都不再适用。
  • 你希望这种同步能够与流行的第三方远程主机(如GitHub)无缝工作。

asciicast

用法

安装 git-nomad 以使其在您的 $PATH 中可用。假设您正在使用常规的git工作流程进行开发

rraval@desktop:~/git-nomad$ git checkout -b feature
rraval@desktop:~/git-nomad$ touch new_file
rraval@desktop:~/git-nomad$ git add .
rraval@desktop:~/git-nomad$ git commit -m "new file"

您可以在任何时候使用以下命令推送您本地分支的状态:

# Synchronizes with a remote called `origin` by default.
# See `--help` for overriding this explicitly.
rraval@desktop:~/git-nomad$ git nomad sync
Pushing local branches to origin... 3s
Fetching branches from origin... 0s
Listing branches at origin... 3s

desktop
  refs/nomad/desktop/feature -> c340cd55853339e4d039746495cdb80cd9e46123
  refs/nomad/desktop/master -> 267719fb8448cc1cbef2c35a638610573779f2ac

在某个未来的某个时刻,您希望在另一台机器上继续开发

rraval@laptop:~/git-nomad$ git nomad sync
Pushing local branches to origin... 2s
Fetching branches from origin... 1s
Listing branches at origin... 2s

desktop
  refs/nomad/desktop/feature -> 1a101799507ba67d822b97105aafa0ac91ce5183
  refs/nomad/desktop/master -> 267719fb8448cc1cbef2c35a638610573779f2ac
laptop
  refs/nomad/laptop/master -> 267719fb8448cc1cbef2c35a638610573779f2ac

这会打印出要使用的引用,以便从上次停止的地方继续

rraval@laptop:~/git-nomad$ git checkout -b feature refs/nomad/desktop/feature
# Hack away where you left off on desktop

假设当前开发是在笔记本电脑上进行的,所以您回到台式机丢弃现在过时的分支

rraval@desktop:~/git-nomad$ git checkout master
rraval@desktop:~/git-nomad$ git branch -D feature
Deleted branch feature (was 1a10179).

rraval@desktop:~/git-nomad$ git nomad sync
Pushing local branches to origin... 2s
Fetching branches from origin... 1s
Listing branches at origin... 0s
Pruning branches at origin... 0s
  Delete refs/nomad/desktop/feature (was 1a101799507ba67d822b97105aafa0ac91ce5183)... 0s

desktop
  refs/nomad/desktop/master -> 267719fb8448cc1cbef2c35a638610573779f2ac
laptop
  refs/nomad/laptop/feature -> dedf3f9d3ad279a401877b351c3ec13aa47cbbd4
  refs/nomad/laptop/master -> 267719fb8448cc1cbef2c35a638610573779f2ac

如果您想停止使用 git-nomad 并清理它创建的所有引用

# See also the `purge --host` option.
rraval@desktop:~/git-nomad$ git nomad purge --all
Fetching branches from origin... 1s
Listing branches at origin... 0s
Pruning branches at origin... 2s
  Delete refs/nomad/desktop/master (was 267719fb8448cc1cbef2c35a638610573779f2ac)... 0s
  Delete refs/nomad/laptop/feature (was dedf3f9d3ad279a401877b351c3ec13aa47cbbd4)... 0s
  Delete refs/nomad/laptop/master (was 267719fb8448cc1cbef2c35a638610573779f2ac)... 0s

工作原理

Git是一个毫无顾忌的内容寻址文件系统,它操作 blobtreecommit 对象。在这个之上是一个相当不错的版本控制系统,尽管这个说法最多是具有争议性的。

Git分支是在一个更通用的方案 refs 之上实现的,其中本地分支 master 只是 refs/heads/master 指向的提交。Git为自身保留了几个层次结构以供使用

  • refs/heads/* 表示本地分支。
  • refs/tags/* 表示标签。
  • refs/remotes/* 表示远程分支。

git-nomad 直接与refs交互以实现其轻量级同步方案。

  1. 将本地的 refs/heads/* 推送到远程的 refs/nomad/{user}/{host}/*。这允许多个主机上的多个用户同时使用同一远程的 git-nomad,而不会覆盖数据。
  2. 从远程 refs/nomad/{user}/* 拉取到本地的 refs/nomad/*。这使得特定用户的所有主机引用都在本地克隆中可用。
  3. 修剪本地 refs/nomad/* 引用,其中对应的分支已被删除。

使用refs的好处

  • 你只需为分支独有的内容支付存储成本。大部分仓库历史都是共享的!
  • 随着refs的清理,git 的自动垃圾收集应该会回收空间。
  • 由于这些refs位于单独的 refs/nomad 层级中,它们不受通常只有快速前进规则的约束。

安装

在 Linux 或 Mac OS X 上

GitHub 上的发布版有预构建的二进制资产:https://github.com/rraval/git-nomad/releases

  1. 下载适用于您的 OS 的最新版本。
  2. 使用 gunzip 解压下载的文件。
  3. 将二进制文件放在您的 $PATH 中的某个位置。
  4. 使用 git nomad --version 检查一切是否正常。

在 NixOS / 通过 Nix

通过 nixpkgs 安装

$ nix-env --install git-nomad

从源代码

如果您有 cargo 可用

$ cargo install git-nomad

尖端版本

通过 nix run

Nix 可以通过以下方式直接从 GitHub 构建和运行二进制文件:

$ nix run github:rraval/git-nomad

贡献

有几个方法可以使这个项目变得更好

  1. 试用并 提交问题 当事情出错时。使用 -vv 标志来捕获运行的所有命令的所有信息。
  2. 为各种操作系统构建软件包。

依赖关系

~4–13MB
~165K SLoC