Moving repositories managed by GitLab

Moving repositories managed by GitLab

有时,您需要将 GitLab 管理的所有存储库移至另一个文件系统或另一个服务器. 在本文档中,我们将介绍将所有存储库从 /mnt/gitlab/repositories/mnt/gitlab/repositories .

我们将研究三种情况:目标目录为空,目标目录包含版本库的过时副本,以及如何处理数千个版本库.

我们列出的每种方法都可以/将覆盖目标目录/mnt/gitlab/repositories . 不要混淆源和目标.

如果目标目录/mnt/gitlab/repositories为空,则最简单的操作是使用 tar 管道. 此方法的开销很低,并且 tar 几乎总是已安装在系统上. 但是,无法恢复中断的 tar 管道:如果发生这种情况,则必须再次复制所有数据.

如果要查看进度,请用-xvf替换-xf .

  1. sudo -u git sh -c 'tar -C /var/opt/gitlab/git-data/repositories -cf - -- . |\
  2. ssh git@newserver tar -C /mnt/gitlab/repositories -xf -'

如果您想在数据通过网络之前进行压缩(这将花费您的 CPU 周期),则可以将ssh替换为ssh -C .

如果目标目录已经包含部分/过时的存储库副本,那么再次用 tar 复制所有数据可能会很浪费. 在这种情况下,最好使用 rsync. 该实用程序已经安装在系统上,也可以通过 apt,yum 等轻松安装.

/. 在上面的命令中非常重要,没有它,您很容易在目标目录中获得错误的目录结构. 如果要查看进度,请用-av替换-a .

如果源系统上的用户对目标服务器具有 SSH 访问权限,则可以使用 rsync 通过网络发送存储库.

  1. sudo -u git sh -c 'rsync -a --delete /var/opt/gitlab/git-data/repositories/. \
  2. git@newserver:/mnt/gitlab/repositories'

每次启动 rsync 作业时,它都必须检查源目录中的所有文件,目标目录中的所有文件,然后确定要复制或不复制哪些文件. 如果源目录或目标目录中包含许多内容,则 rsync 的启动阶段可能会成为您的 GitLab 服务器的负担. 在这种情况下,可以通过将 rsync 的工作分成较小的部分来使 rsync 的工作变得更轻松,并一次同步一个存储库.

此过程不会清理源位置不再存在的目标位置的存储库. 如果您开始在/mnt/gitlab/repositories使用 GitLab 实例,则需要在切换到新的存储库存储目录后运行gitlab-rake gitlab:cleanup:repos .

这将一次将存储库与 10 个 rsync 进程同步. 我们会跟踪进度,以便在必要时可以重新开始传输.

首先,我们创建一个新目录,由git拥有,以保存传输日志. 在开始传输过程之前,我们假定目录为空,并且我们是唯一在其中写入文件的目录.

我们使用要复制的目录列表为该过程添加种子.

  1. # Omnibus
  2. sudo -u git sh -c 'gitlab-rake gitlab:list_repos > /var/opt/gitlab/transfer-logs/all-repos-$(date +%s).txt'
  3. # Source
  4. cd /home/git/gitlab
  5. sudo -u git -H sh -c 'bundle exec rake gitlab:list_repos > /home/git/transfer-logs/all-repos-$(date +%s).txt'

现在我们可以开始传输了. 下面的命令是幂等的,并且 GNU Parallel 完成的作业数应收敛为零. 如果不是这样,则all-repos-1234.txt列出的某些存储库在被复制之前可能已被删除/重命名.

  1. # Omnibus
  2. /usr/bin/env JOBS=10 \
  3. /opt/gitlab/embedded/service/gitlab-rails/bin/parallel-rsync-repos \
  4. success-$(date +%s).log \
  5. /var/opt/gitlab/git-data/repositories \
  6. /mnt/gitlab/repositories
  7. # Source
  8. cd /home/git/gitlab
  9. sudo -u git -H bundle exec rake gitlab:list_repos SINCE='2015-10-1 12:00 UTC' |\
  10. sudo -u git -H \
  11. /usr/bin/env JOBS=10 \
  12. bin/parallel-rsync-repos \
  13. success-$(date +%s).log \