Compartir a través de


Importación de un repositorio de Git en un proyecto

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020

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

Categoría Requisitos
Acceso al proyecto Miembro de un proyecto .
Permisos - Ver código en proyectos privados: al menos acceso básico.
- Clonar o contribuir al código en proyectos privados: ser miembro del grupo de seguridad Contribuidores o contar con los permisos correspondientes en el proyecto.
- Establecer permisos de rama o repositorio: Administrar los permisos relacionados con la rama o el repositorio.
- Cambiar la rama predeterminada: Editar directivas para los permisos del repositorio.
- Importar un repositorio: miembro del grupo de seguridad de Administradores de proyecto o repositorio Git a nivel de proyecto Crear repositorio con la opción Permitir. Para obtener más información, consulte Establecimiento de permisos de repositorios Git.
Servicios Repositorio habilitado.
Herramientas Opcional. Use los comandos az repos: Azure DevOps CLI.

Nota

En proyectos públicos, los usuarios con acceso a las partes interesadas tienen acceso completo a Azure Repos, incluida la visualización, la clonación y la contribución al código.

Categoría Requisitos
Acceso al proyecto Miembro de un proyecto .
Permisos - Ver código: al menos acceso básico.
- Clonar o contribuir al código: Miembro de la Colaboradores grupo de seguridad o los permisos correspondientes en el proyecto.
Servicios Repositorio habilitado.

Importación a un repositorio nuevo

Realice los pasos siguientes para importar en un nuevo repositorio:

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 main, se establece como la rama predeterminada; de lo contrario, la primera rama (en orden alfabético) del repositorio importado se establece como Default.

  1. En su navegador, inicie sesión en su organización y seleccione Repos>.

    Captura de pantalla mostrando la vista de las ramas.

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

    Captura de pantalla que muestra la pantalla Administrar repositorios.

  3. Escriba la dirección URL de clonación del repositorio de origen y un nombre para el nuevo repositorio de Git.

Captura de pantalla que muestra el cuadro de diálogo Importar repositorio con la dirección URL del repositorio de ejemplo disponible públicamente.

  1. Seleccione Importar un repositorio.

El repositorio se importa.

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. Proporcione credenciales si el repositorio de origen requiere autenticación.

Captura de pantalla de la importación de un repositorio en 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.

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 y 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. Para mejorar la seguridad, se recomienda usar tokens de identificador de Entra de Microsoft siempre que sea posible. A continuación, la solicitud de importación incluye 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

  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 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

    El uso de --mirror sobrescribe 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, recójalos y cópielos del repositorio de origen al 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 (FAQ)

Aunque las importaciones se realizan con más frecuencia, las siguientes condiciones pueden causar problemas.

P: ¿Qué ocurre si mi repositorio de origen está detrás de la autenticación en dos fases?

R: El servicio de importación usa las API REST para validar y desencadenar la importación y no puede trabajar directamente con repositorios que requieren autenticación en dos fases.

La mayoría de los proveedores de hospedaje de Git admiten tokens de autenticación que se pueden proporcionar al servicio de importación:

Tokens de id. de Microsoft Entra (recomendado): Los tokens de id. de Microsoft Entra proporcionan una mayor seguridad y son el método de autenticación recomendado. Puede obtener estos tokens a través de:

  • CLI de Azure (para desarrollo y pruebas):

    az account get-access-token --resource 499b84ac-1321-427f-aa17-267ca6975798 --query "accessToken" --output tsv
    
  • Principal de servicio (para escenarios de producción o automatizados):

    • Registro de una aplicación en Microsoft Entra ID
    • Creación de un secreto de cliente para la aplicación
    • Concesión de permisos adecuados a la aplicación en Azure DevOps
    • Uso de las credenciales de la entidad de servicio para obtener tokens de forma programática

Tokens de acceso personal (alternativa):GitHub y Azure DevOps también admiten tokens de acceso personal.

P: ¿Qué ocurre si mi repositorio de origen no admite multi_ack?

R: 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, el servicio de importación puede no importar desde el origen especificado. Este error puede producirse al crear una solicitud de importación o mientras la importación está en curso.

P: ¿Puedo importar desde versiones anteriores?

R: Si el repositorio git de origen está en una versión local anterior a 2017 RTM, se produce un error en la importación debido a un error de coincidencia de contrato entre las versiones anteriores y Azure DevOps más recientes.

P: ¿Puedo usar credenciales basadas en MSA?

R: Desafortunadamente, las credenciales basadas en MSA (cuenta microsoft) no funcionan. El servicio de importación emplea una autenticación básica para comunicarse con el repositorio de origen. Si el nombre de usuario y la contraseña que usa no son autenticación básica, se producirá un error en la autenticación e importación. Una manera de comprobar si el nombre de usuario o la contraseña que usa son autenticación básica es intentar usar Git para clonar el repositorio con el formato siguiente:

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

P: ¿Puedo importar desde TFVC?

R: Puede migrar código de un repositorio TFVC existente a un nuevo repositorio de Git dentro de la misma cuenta. Aunque la migración a Git tiene muchas ventajas, es un proceso implicado para los grandes repositorios y equipos de TFVC. 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. Es un cambio disruptivo que requiere una planificación cuidadosa. Para obtener más información, vea Importación de TFVC a Git.

P: ¿Qué ocurre si mi repositorio de origen contiene objetos LFS de Git?

R: La importación de Git no importa 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. Esta acción copia todos los objetos de Git desde el origen a Azure DevOps, que también importa los punteros LFS que son objetos git, pero no los archivos LFS.

Para desplazarse por los archivos LFS, necesita Git.exe y el cliente LFS en el mismo cuadro y acceder tanto al repositorio de origen como al repositorio de destino.

  • Clone el repositorio importado de Azure DevOps en el sistema local. La clonación funciona, pero falla al realizar el checkout de los archivos LFS.
  • Agregue el repositorio de origen como remoto, por ejemplo, "source"
  • Realice la acción git lfs fetch source --all, que transfiere todos los archivos LFS del origen a su repositorio local.
  • Suponiendo que el repositorio VSTS de destino es el remoto de "destino"
  • Use el comando git lfs push target --all.

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

R: El servicio de importación es para importar inicialmente un repositorio completo. Para reflejar cambios posteriores, necesita un clon local del repositorio con los remotos configurados tanto para origen como para destino.

Los cambios se pueden sincronizar mediante los siguientes comandos. Tratamos 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