Importación de un repositorio de Git

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2019

En este artículo se explica cómo importar un repositorio Git existente desde GitHub, Bitbucket, GitLab u otra ubicación en un repositorio nuevo o vacío existente en el proyecto de Azure DevOps.

Requisitos previos

  • Una organización en Azure DevOps. Si no tiene una, puede registrarse de forma gratuita. Cada organización incluye repositorios Git privados, gratuitos e ilimitados.
  • Para crear o importar un repositorio, debe ser miembro del grupo de seguridad Administradores de proyectos o tener el permiso Crear repositorio de nivel de proyecto de Git establecido en Permitir. Para obtener más información, vea Establecimiento de permisos de repositorios Git.
  • Para usar la característica Importar repositorio de Azure DevOps, debe tener TFS 2017 Update 1 o una versión posterior.
  • Para importar un repositorio mediante TFS 2017 RTM o una versión anterior, vea Importación manual de un repositorio mediante la CLI de Git.
  • Si quiere usar comandos az repos, asegúrese de seguir los pasos que se describen en Introducción a la CLI de Azure DevOps.
  • Una organización en Azure DevOps. Si no tiene una, puede registrarse de forma gratuita. Cada organización incluye repositorios Git privados, gratuitos e ilimitados.
  • Para crear o importar un repositorio, debe ser miembro del grupo de seguridad Administradores de proyectos o tener el permiso Crear repositorio de nivel de proyecto de Git establecido en Permitir. Para obtener más información, vea Establecimiento de permisos de repositorios Git.
  • Para usar la característica Importar repositorio de Azure DevOps, debe tener TFS 2017 Update 1 o una versión posterior.
  • Para importar un repositorio mediante TFS 2017 RTM o una versión anterior, vea Importación manual de un repositorio mediante la CLI de Git.

Nota:

Una vez completada la importación del repositorio, Azure DevOps establece la rama predeterminada para ese repositorio importado. Si el repositorio importado contiene una rama denominada master, se establece como la rama predeterminada; de lo contrario, la primera rama (en orden alfabético) del repositorio importado se establece como predeterminada.

Importación a un repositorio nuevo

  1. Seleccione Repositorios > Archivos.

    Visualización de las ramas

  2. En la lista desplegable del repositorio, seleccione Importar repositorio.

    Administrar repositorios

  3. Si el repositorio de origen está disponible públicamente, basta con escribir la dirección URL de clonación del repositorio de origen y un nombre para el nuevo repositorio Git.

    Si el repositorio de origen es privado, pero se puede acceder a él mediante autenticación básica (nombre de usuario+contraseña, un token de acceso personal, etc.), seleccione Requiere autorización y escriba sus credenciales. No se puede usar la autenticación SSH, pero sí importar manualmente un repositorio que use la autenticación SSH; para ello, siga los pasos descritos en Importación manual de un repositorio mediante la CLI de Git.

    Cuadro de diálogo Importar repositorio

Importación en un repositorio vacío existente

En la página Archivos del repositorio Git vacío, seleccione Importar y escriba la dirección URL de clonación. Deberá proporcionar credenciales si el repositorio de origen requiere autenticación.

Importar repositorio a un repositorio existente

Nota:

La característica de importación deshabilita la vinculación automatizada de los elementos de trabajo mencionados en un comentario de confirmación, ya que es posible que los identificadores de esos elementos de trabajo del proyecto de destino no sean los mismos que los del proyecto de origen. Para volver a habilitar la vinculación automática de los elementos de trabajo mencionados en una confirmación, vaya a Configuración, Control de versiones, seleccione el repositorio y, luego, Opciones. Para obtener más información sobre cómo vincular confirmaciones con elementos de trabajo, vea Vinculación de elementos de trabajo con confirmaciones.

Importación manual de un repositorio mediante la CLI de az repos

Se puede usar az repos import para importar un repositorio a su proyecto de Azure DevOps.

Nota:

Para poder importar un repositorio Git, antes deberá crear el repositorio en Azure DevOps. Además, el repositorio que cree debe estar vacío. Para crear un repositorio, vea Creación de un repositorio Git en Azure Repos.

az repos import create --git-source-url
                       [--detect {false, true}]
                       [--git-service-endpoint-id]
                       [--org]
                       [--project]
                       [--repository]
                       [--requires-authorization]
                       [--subscription]
                       [--user-name]

Parámetros

Parámetro Descripción
git-source-url Necesario. Dirección URL del repositorio Git de origen que se va a importar.
detect Opcional. Detecta automáticamente la organización. Valores aceptados: false, true.
git-service-endpoint-id Opcional. Punto de conexión de servicio para conectar con el punto de conexión externo.
org, organization URL de la organización de Azure DevOps. Puede configurar la organización predeterminada mediante az devops configure -d organization=<ORG_URL>. Obligatorio si no está configurado como predeterminado o seleccionado mediante la configuración de Git. Ejemplo: https://dev.azure.com/MyOrganizationName/.
project, p Nombre o id. del proyecto. Puede configurar el proyecto predeterminado mediante az devops configure -d project=<NAME_OR_ID>. Obligatorio si no está configurado como predeterminado o seleccionado mediante la configuración de Git.
repository Nombre o identificador del repositorio en el que se va a crear la solicitud de importación.
requires-authorization Marca para indicar si el repositorio Git de origen es privado. Si necesita autenticación, genere un token de autenticación en el repositorio de origen y establezca la variable de entorno AZURE_DEVOPS_EXT_GIT_SOURCE_PASSWORD_OR_PAT en el valor del token. La solicitud de importación incluirá la autenticación.
subscription Nombre o identificador de la suscripción Puede configurar la suscripción predeterminada mediante az account set -s <NAME_OR_ID>.
user-name Nombre de usuario que se va a especificar cuando el repositorio Git es privado.

Ejemplo

El siguiente comando importa el repositorio público fabrikam-open-source al repositorio Git vacío fabrikam-open-source para la configuración predeterminada az devops configure --defaults organization=https://dev.azure.com/fabrikamprime project="Fabrikam Fiber".

az repos import create --git-source-url https://github.com/fabrikamprime/fabrikam-open-source --repository fabrikam-open-source
{
  "detailedStatus": {
    "allSteps": [
      "Processing request",
      "Analyzing repository objects",
      "Storing objects",
      "Storing index file",
      "Updating references",
      "Import completed successfully"
    ],
    "currentStep": 6,
    "errorMessage": null
  },
  "importRequestId": 8,
  "parameters": {
    "deleteServiceEndpointAfterImportIsDone": null,
    "gitSource": {
      "overwrite": false,
      "url": "https://github.com/fabrikamprime/fabrikam-open-source"
    },
    "serviceEndpointId": null,
    "tfvcSource": null
  },
  "repository": {
    "defaultBranch": null,
    "id": "0f6919cd-a4db-4f34-a73f-2354114a66c4",
    "isDisabled": false,
    "isFork": null,
    "name": "new-empty-repo",
    "parentRepository": null,
    "project": {
      "abbreviation": null,
      "defaultTeamImageUrl": null,
      "description": "Guidance and source control to foster a vibrant ecosystem for Fabrikam Fiber applications and extensions.",
      "id": "56af920d-393b-4236-9a07-24439ccaa85c",
      "lastUpdateTime": "2021-05-24T21:52:14.95Z",
      "name": "Fabrikam Fiber",
      "revision": 438023732,
      "state": "wellFormed",
      "url": "https://dev.azure.com/fabrikamprime/_apis/projects/56af920d-393b-4236-9a07-24439ccaa85c",
      "visibility": "private"
    },
    "remoteUrl": "https://fabrikamprime@dev.azure.com/fabrikamprime/Fabrikam%20Fiber/_git/fabrikam-open-source",
    "size": 12477,
    "sshUrl": "git@ssh.dev.azure.com:v3/kelliott/Fabrikam%20Fiber/new-empty-repo",
    "url": "https://dev.azure.com/fabrikamprime/56af920d-393b-4236-9a07-24439ccaa85c/_apis/git/repositories/0f6919cd-a4db-4f34-a73f-2354114a66c4",
    "validRemoteUrls": null,
    "webUrl": "https://dev.azure.com/fabrikamprime/Fabrikam%20Fiber/_git/fabrikam-open-source"
  },
  "status": "completed",
  "url": "https://dev.azure.com/fabrikamprime/Fabrikam%20Fiber/_apis/git/repositories/0f6919cd-a4db-4f34-a73f-2354114a66c4/importRequests/8"
}

Importación manual de un repositorio mediante la CLI de Git

La característica de importación de repositorio se incluyó a partir de TFS 2017 Update 1. Si usa TFS 2017 RTM o una versión anterior, puede usar los siguientes pasos para importar un repositorio manualmente a TFS. También puede seguir estos pasos para importar un repositorio manualmente a un repositorio de Azure DevOps Services, reemplazando TFS por Azure Repos.

  1. Clone el repositorio de origen en una carpeta temporal del equipo con la opción bare, como se muestra en el siguiente ejemplo de línea de comandos, y luego vaya a la carpeta del repositorio. Cuando se clona con la opción bare, el nombre de la carpeta incluye el sufijo .git. En este ejemplo, https://github.com/contoso/old-contoso-repo.git es el repositorio de origen que se va a importar manualmente.

    git clone --bare https://github.com/contoso/old-contoso-repo.git
    cd old-contoso-repo.git
    
  2. Cree un repositorio de destino con TFS 2017 RTM y anote la dirección URL de clonación. En este ejemplo, https://dev.azure.com/contoso-ltd/MyFirstProject/_git/new-contoso-repo es la dirección URL del nuevo repositorio de destino.

  3. Ejecute el siguiente comando para copiar el repositorio de origen en el repositorio de destino.

    git push --mirror https://dev.azure.com/contoso-ltd/MyFirstProject/_git/new-contoso-repo
    

    Advertencia

    Usar --mirror hará que se sobrescriban todas las ramas del repositorio de destino, lo que incluye eliminar las ramas que no estén en el repositorio de origen.

  4. Si el repositorio de origen tiene objetos LFS, captúrelos y cópielos del repositorio de origen en el repositorio de destino.

    git lfs fetch origin --all
    git lfs push --all https://dev.azure.com/contoso-ltd/MyFirstProject/_git/new-contoso-repo
    
  5. Para eliminar la carpeta temporal, ejecute los siguientes comandos.

    cd ..
    rm -rf old-contoso-repo.git
    

Preguntas más frecuentes

Aunque la mayoría de las veces la importación se realiza correctamente, las siguientes situaciones pueden causar problemas.

¿Qué ocurre si el repositorio de origen requiere autenticación en dos fases?

El servicio de importación usa API REST para validar y desencadenar la importación, y no puede trabajar directamente con repositorios que requieran autenticación en dos fases. La mayoría de los proveedores de hospedaje de Git, como GitHub y Azure DevOps Services, admite tokens personales que se pueden proporcionar al servicio de importación.

¿Qué ocurre si el repositorio de origen no admite multi_ack?

El servicio de importación usa la funcionalidad multi_ack del protocolo Git durante la importación. Si el repositorio de origen no proporciona esta funcionalidad, es posible que el servicio de importación no pueda realizar la importación desde el origen especificado. Este error puede producirse al crear una solicitud de importación o mientras la importación está en curso.

¿Puedo importar desde versiones anteriores de Team Foundation Server?

Si el repositorio Git de origen está en una versión de TFS anterior a TFS 2017 RTM, se producirá un error en la importación. Esto sucede debido a una discrepancia de contrato entre las versiones más recientes de Azure DevOps Services/TFS y las versiones de TFS anteriores a 2017 RTM.

¿Puedo usar credenciales basadas en MSA?

Desafortunadamente, las credenciales basadas en MSA (cuenta Microsoft, anteriormente Live ID) no funcionarán. El servicio de importación emplea una autenticación básica para comunicarse con el repositorio de origen. Si el nombre de usuario o la contraseña que use no pertenecen a la autenticación básica, se producirá un error en la autenticación y la importación no se llevará a cabo. Una manera de comprobar si el nombre de usuario o la contraseña que está usando pertenecen o no a la autenticación básica es intentar usar Git para clonar el repositorio con el siguiente formato.

git clone https://<<username>>:<<password>>@<<remaining clone Url>>

¿Puedo importar desde TFVC?

Se puede migrar código de un repositorio TFVC existente a un nuevo repositorio Git dentro de la misma cuenta. Aunque la migración a Git tiene muchas ventajas, se trata de un proceso complicado para los equipos y los repositorios de TFVC grandes. Los sistemas de control de versiones centralizados, como TFVC, se comportan en esencia de forma distinta a Git. El cambio acarrea mucho más que aprender nuevos comandos. Se trata de un cambio trascendental que precisa una planificación meticulosa. Para obtener más información, vea Importación de TFVC a Git.

¿Qué ocurre si el repositorio de origen contiene objetos LFS de Git?

La importación de Git no importará los objetos LFS de Git.

Para mover objetos LFS, puede hacer lo siguiente:

  • Importe el repositorio usando la característica de importación de repositorio de Azure DevOps. Esto hará que se copien todos los objetos de Git desde el origen a Azure DevOps (lo cual también importará los punteros LFS, que son objetos de Git, pero no los archivos LFS).

Para mover los archivos LFS (necesitará tener tanto Git.exe como el cliente LFS en el mismo sitio, así como acceso al repositorio tanto de origen como de destino):

  • Clone el repositorio importado de Azure DevOps en el sistema local; el clon funcionará, pero se producirá un error al intentar extraer del repositorio los archivos LFS.
  • Agregue el repositorio de origen como un repositorio remoto (digamos que se llama "source").
  • Use el comando git lfs fetch source --all (esto trasladará todos los archivos LFS del origen al repositorio local).
  • Suponiendo que el repositorio VSTS de destino es un repositorio remoto llamado "target":
  • Use el comando git lfs push target --all.

¿Puedo importar actualizaciones si el origen cambia más adelante?

El servicio de importación sirve para importar inicialmente un repositorio entero. Para reflejar los cambios que se produzcan posteriormente, necesitará un clon local del repositorio con referencias remotas establecidas en el origen y el destino.

Los cambios se pueden sincronizar mediante los siguientes comandos. Consideraremos la importación de Azure Repos como origin y el repositorio original como upstream.

git clone --bare <Azure-Repos-clone-URL>.git
cd <name-of-repo>
git remote add --mirror=fetch upstream <original-repo-URL>
git fetch upstream --tags
git push origin --all

Pasos siguientes