Moving repositories managed by GitLab

原文:https://docs.gitlab.com/ee/administration/operations/moving_repositories.html

Moving repositories managed by GitLab

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

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

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

Target directory is empty: use a tar pipe

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

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

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

Tar pipe to another server

You can also use a tar pipe to copy data to another server. If your git user has SSH access to the new server as git@newserver, you can pipe the data through SSH.

  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 .

The target directory contains an outdated copy of the repositories: use rsync

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

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

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

Single rsync to another server

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

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

Thousands of Git repositories: use one rsync per repository

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

除了 rsync 之外,我们还将使用GNU Parallel . 该实用程序未包含在 GitLab 中,因此您需要使用 apt 或 yum 自己安装. 还要注意,我们在下面使用的 GitLab 脚本是在 GitLab 8.1 中添加的.

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

Parallel rsync for all repositories known to GitLab

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

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

  1. # Omnibus
  2. sudo mkdir /var/opt/gitlab/transfer-logs
  3. sudo chown git:git /var/opt/gitlab/transfer-logs
  4. # Source
  5. sudo -u git -H mkdir /home/git/transfer-logs

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

  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. sudo -u git sh -c '
  3. cat /var/opt/gitlab/transfer-logs/* | sort | uniq -u |\
  4. /usr/bin/env JOBS=10 \
  5. /opt/gitlab/embedded/service/gitlab-rails/bin/parallel-rsync-repos \
  6. /var/opt/gitlab/transfer-logs/success-$(date +%s).log \
  7. /var/opt/gitlab/git-data/repositories \
  8. /mnt/gitlab/repositories
  9. '
  10. # Source
  11. cd /home/git/gitlab
  12. sudo -u git -H sh -c '
  13. cat /home/git/transfer-logs/* | sort | uniq -u |\
  14. /usr/bin/env JOBS=10 \
  15. bin/parallel-rsync-repos \
  16. /home/git/transfer-logs/success-$(date +%s).log \
  17. /home/git/repositories \
  18. /mnt/gitlab/repositories
  19. `

Parallel rsync only for repositories with recent activity

假设您已经完成了一次在 2015 年 10 月 1 日 12:00 UTC 之后开始的同步. 然后,您可能只想同步之后通过 GitLab 更改的存储库. 您可以使用SINCE变量告诉rake gitlab:list_repos仅打印具有最近活动的存储库.

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