# Import bare repositories

> 原文：[https://docs.gitlab.com/ee/raketasks/import.html](https://docs.gitlab.com/ee/raketasks/import.html)

*   [Example output](#example-output)
*   [Importing bare repositories from hashed storage](#importing-bare-repositories-from-hashed-storage)
    *   [GitLab 10.3 or earlier](#gitlab-103-or-earlier)
    *   [GitLab 10.4 and later](#gitlab-104-and-later)

# Import bare repositories[](#import-bare-repositories-core-only "Permalink")

Rake 任务可用于将裸仓库导入 GitLab 实例.

注意：

*   项目的所有者将是第一位管理员.
*   将根据需要创建组，包括子组.
*   组的所有者将是第一位管理员.
*   现有项目将被跳过.
*   散列存储中的项目可能会被跳过. 有关更多信息，请参阅[从哈希存储导入裸存储库](#importing-bare-repositories-from-hashed-storage) .
*   现有的 Git 存储库将从磁盘中移出（从原始路径中移出）.

要将裸仓库导入 GitLab 实例：

1.  创建一个新文件夹以从中导入您的 Git 存储库. 新文件夹需要具有 Git 用户所有权，并且需要对 Git 用户及其组具有读/写/执行访问权限：

    ```
    sudo -u git mkdir -p /var/opt/gitlab/git-data/repository-import-<date>/new_group 
    ```

2.  将裸存储库复制到此新创建的文件夹中. 注意：

    *   在任何子文件夹中找到的所有`.git`存储库都将作为项目导入.
    *   将根据需要创建组，这些组可以是嵌套文件夹.

    例如，如果我们将存储库复制到`/var/opt/gitlab/git-data/repository-import-<date>` ，并且存储库`A`必须位于组`G1`和`G2` ，则必须在以下文件夹下创建它： `/var/opt/gitlab/git-data/repository-import-<date>/G1/G2/A.git` .

    ```
    sudo cp -r /old/git/foo.git /var/opt/gitlab/git-data/repository-import-<date>/new_group/

    # Do this once when you are done copying git repositories
    sudo chown -R git:git /var/opt/gitlab/git-data/repository-import-<date> 
    ```

    `foo.git`必须由`git`用户和`git`用户组拥有.

    如果您使用源安装，请用`/home/git`替换`/var/opt/gitlab/` .

3.  根据您的安装类型运行以下命令：

    *   全部安装

    ```
    sudo gitlab-rake gitlab:import:repos['/var/opt/gitlab/git-data/repository-import-<date>'] 
    ```

    *   从源安装. 在运行此命令之前，您需要切换到 GitLab 安装所在的目录：

    ```
    cd /home/git/gitlab
    sudo -u git -H bundle exec rake gitlab:import:repos['/var/opt/gitlab/git-data/repository-import-<date>'] RAILS_ENV=production 
    ```

## Example output[](#example-output "Permalink")

```
Processing /var/opt/gitlab/git-data/repository-import-1/a/b/c/blah.git
 * Using namespace: a/b/c
 * Created blah (a/b/c/blah)
 * Skipping repo  /var/opt/gitlab/git-data/repository-import-1/a/b/c/blah.wiki.git
Processing /var/opt/gitlab/git-data/repository-import-1/abcd.git
 * Created abcd (abcd.git)
Processing /var/opt/gitlab/git-data/repository-import-1/group/xyz.git
 * Using namespace: group (2)
 * Created xyz (group/xyz.git)
 * Skipping repo /var/opt/gitlab/git-data/repository-import-1/@shared/a/b/abcd.git
[...] 
```

## Importing bare repositories from hashed storage[](#importing-bare-repositories-from-hashed-storage "Permalink")

旧版存储中的项目具有目录结构，该目录结构反映了 GitLab 中完整的项目路径，包括名称空间结构. 裸存储库导入程序将利用此信息将项目导入到正确的位置. 每个项目及其父名称空间均有意义地命名.

但是，哈希存储中项目的目录结构不包含此信息. 由于多种原因，这是有益的，尤其是改善的性能和数据完整性. 有关更多详细信息，请参见[存储库存储类型](../administration/repository_storage_types.html) .

可导入的存储库取决于 GitLab 的版本.

### GitLab 10.3 or earlier[](#gitlab-103-or-earlier "Permalink")

不支持从哈希存储导入裸存储库.

### GitLab 10.4 and later[](#gitlab-104-and-later "Permalink")

为了支持从哈希存储中导入裸存储库，GitLab 10.4 和更高版本将每个存储库的完整项目路径存储在 Git 存储库配置文件的特殊部分. 本节的格式如下：

```
[gitlab]
  fullpath = gitlab-org/gitlab 
```

但是，现有存储库并未迁移为包括此路径.

如果 GitLab 10.4 和更高版本中的存储库发生以下事件，则裸存储库是可导入的：

*   Created
*   迁移到哈希存储
*   Renamed
*   转移到另一个名称空间
*   祖先更名
*   祖先转移到另一个名称空间

如果仓库满足以下所有条件，则裸仓库**无法**通过 GitLab 10.4 导入到 GitLab 11.6：

*   它是在 GitLab 10.3 或更早版本中创建的.
*   它没有重命名，传输或迁移到 GitLab 10.4 的[哈希存储](../administration/repository_storage_types.html#hashed-storage)中，也没有迁移到 GitLab 11.6.
*   它的祖先名称空间未在 GitLab 10.4 中重命名或传输到 GitLab 11.6.

[从 GitLab 11.6 开始](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/41776) ，所有裸仓库都可以导入.

要自己手动迁移存储库（对于从 GitLab 10.4 到 GitLab 11.6 的迁移），可以使用[Rails 控制台](../administration/troubleshooting/debug.html#starting-a-rails-console-session)进行. 在 Rails 控制台会话中，运行以下命令来迁移项目：

```
project = Project.find_by_full_path('gitlab-org/gitlab')
project.write_repository_config 
```

在 Rails 控制台会话中，运行以下命令以迁移名称空间的所有项目（如果名称空间中有数千个项目，则可能需要一段时间）：

```
namespace = Namespace.find_by_full_path('gitlab-org')
namespace.send(:write_projects_repository_config) 
```