问题

在实践中,往往需要存在相同仓库的多个副本同时工作。但是不同的副本存在相同内容的 .git 目录,其次不同的仓库拉取时会浪费时间拉取相同的内容。

环境

  • macOS 10.13.6
  • Git 2.19

解决方案

git worktree

git worktree 是官方推荐的管理工作目录的用法,但是在实践中存在一个严重问题:不同工作目录无法签出同一个分支。

这个限制大大影响了使用范围。

git-new-workdir

git-new-workdir 是官方自带的辅助脚本,原理是使用符号链接对需要的文件与目录进行链接,从而实现共享。

使用以下命令可以快速创建仓库的多个副本:

1
<git-install-dir>/share/git-core/contrib/workdir/git-new-workdir <repository> <new_workdir> [<branch>]

注意事项

  1. 对于需要同时操作的副本,并不适用,因为 Git 有可能在同时进行操作,但是 .gitlock 文件只会在各自的副本目录中生成,有可能导致仓库错乱。因此需要避免同时操作仓库。
  2. 使用时需要额外处理 lfs 目录,截止到 20180924 的最新 2.19 版本中依然不支持。
  3. 还需要将从原始仓库中拷贝 ref 目录,而不是使用符号链接,否则两边的仓库会互相影响。

修改版脚本

将 Git 自带的 git-new-workdir 脚本中 82 行 refs 改为 lfs,同时拷贝 refs 目录。

为了方便使用,创建了单独的脚本:

networm/git-new-workdir: Change refs to lfs in symbol links to improve usability for both work directories isolation and Git LFS support.