Importar um repositório Git

Serviços de DevOps do Azure | Azure DevOps Server 2022 - Azure DevOps Server 2019

Este artigo mostra como importar um repositório Git existente do GitHub, Bitbucket, GitLab ou outro local para um repositório existente novo ou vazio em seu projeto de DevOps do Azure.

Pré-requisitos

  • Uma organização no Azure DevOps. Se você não tiver um, você pode se inscrever para um gratuitamente. Cada organização inclui repositórios Git privados gratuitos e ilimitados.
  • Para criar ou importar um repositório, você deve ser membro do grupo de segurança Administradores de Projeto ou ter a permissão Criar repositório no nível do projeto Git definida como Permitir. Para obter mais informações, consulte Definir permissões do repositório Git.
  • Para usar o recurso de repositório de Importação de DevOps do Azure, você deve ter o TFS 2017 Atualização 1 ou superior.
  • Para importar um repositório usando o TFS 2017 RTM ou anterior, consulte Importar manualmente um repositório usando a CLI do git.
  • Se você quiser usar comandos az repos, siga as etapas em Introdução à CLI do Azure DevOps.
  • Uma organização no Azure DevOps. Se você não tiver um, você pode se inscrever para um gratuitamente. Cada organização inclui repositórios Git privados gratuitos e ilimitados.
  • Para criar ou importar um repositório, você deve ser membro do grupo de segurança Administradores de Projeto ou ter a permissão Criar repositório no nível do projeto Git definida como Permitir. Para obter mais informações, consulte Definir permissões do repositório Git.
  • Para usar o recurso de repositório de Importação de DevOps do Azure, você deve ter o TFS 2017 Atualização 1 ou superior.
  • Para importar um repositório usando o TFS 2017 RTM ou anterior, consulte Importar manualmente um repositório usando a CLI do git.

Nota

Quando a importação do repositório é concluída, o Azure DevOps define a ramificação Padrão para esse repositório importado. Se o repositório importado contiver uma ramificação chamada master, ela será definida como a ramificação padrão, caso contrário, a primeira ramificação (em ordem alfabética) do repositório importado será definida como Padrão.

Importar para um novo repositório

  1. Selecione Repos, Arquivos.

    Ver as suas filiais

  2. Na lista suspensa do repositório, selecione Importar repositório.

    Gerenciar repositórios

  3. Se o repositório de origem estiver disponível publicamente, basta inserir a URL de clone do repositório de origem e um nome para seu novo repositório Git.

    Se o repositório de origem for privado, mas puder ser acessado usando autenticação básica (nome de usuário-senha, token de acesso pessoal, etc.), selecione Requer autorização e insira suas credenciais. A autenticação SSH não é suportada, mas você pode importar manualmente um repositório que usa autenticação SSH seguindo as etapas em Importar manualmente um repositório usando a CLI do git.

    Caixa de diálogo Importar repositório

Importar para um repositório vazio existente

Na página Arquivos do repositório Git vazio, selecione Importar e insira a URL de clonagem. Você precisará fornecer credenciais se o repositório de origem exigir autenticação.

Importar repositório para um repositório existente

Nota

O recurso de importação desabilita a vinculação automatizada para itens de trabalho mencionados em um comentário de confirmação, pois as IDs de item de trabalho no projeto de destino podem não ser as mesmas do projeto de origem. A vinculação automática para itens de trabalho mencionados em uma confirmação pode ser reativada navegando até Configurações, Controle de Versão, selecionando seu repositório e escolhendo Opções. Para obter mais informações sobre como vincular confirmações a itens de trabalho, consulte Vincular itens de trabalho a confirmações

Importar manualmente um repositório com a CLI az repos

Você pode usar az repos import para importar um repositório para seu projeto do Azure DevOps.

Nota

Você deve primeiro criar o repositório no Azure DevOps antes de poder importar um repositório Git. Além disso, o repositório criado deve estar vazio. Para criar um repositório, consulte Criar seu repositório Git no 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 Description
git-source-url Obrigatório. URL do repositório git de origem a ser importado.
detect Opcional. Detete automaticamente a organização. Valores aceites: false, true.
git-service-endpoint-id Opcional. Ponto de extremidade de serviço para conexão com ponto de extremidade externo.
org, organization URL da organização do Azure DevOps. Você pode configurar a organização padrão usando az devops configure -d organization=<ORG_URL>. Necessário se não configurado como padrão ou captado via git config. Exemplo: https://dev.azure.com/MyOrganizationName/.
project, p Nome ou ID do projeto. Você pode configurar o projeto padrão usando az devops configure -d project=<NAME_OR_ID>. Necessário se não configurado como padrão ou captado via git config.
repository Nome ou ID do repositório no qual criar a solicitação de importação.
requires-authorization Sinalizador para indicar se o repositório git de origem é privado. Se você precisar de autenticação, gere um token de autenticação no repositório de origem e defina a variável AZURE_DEVOPS_EXT_GIT_SOURCE_PASSWORD_OR_PAT de ambiente como o valor do token. Em seguida, a solicitação de importação incluirá autenticação.
subscription o nome ou o ID da subscrição. Você pode configurar a assinatura padrão usando az account set -s <NAME_OR_ID>o .
user-name Nome de usuário para especificar quando o repositório git é privado.

Exemplo

O comando a seguir importa o repositório público fabrikam-open-source para o repositório Git vazio fabrikam-open-source para a configuração az devops configure --defaults organization=https://dev.azure.com/fabrikamprime project="Fabrikam Fiber"padrão.

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

Importar manualmente um repositório com a CLI git

O recurso de repositório de importação foi introduzido na Atualização 1 do TFS 2017. Se você estiver usando o TFS 2017 RTM ou anterior, poderá usar as etapas a seguir para importar manualmente um repositório para o TFS. Você também pode seguir estas etapas para importar manualmente um repositório para um repositório dos Serviços de DevOps do Azure substituindo o TFS pelo Azure Repos nas etapas a seguir.

  1. Clone o repositório de origem em uma pasta temporária no seu computador usando a bare opção, conforme mostrado no exemplo de linha de comando a seguir, e navegue até a pasta do repositório. Ao clonar usando a bare opção, o nome da pasta inclui o sufixo .git . Neste exemplo, https://github.com/contoso/old-contoso-repo.git é o repositório de origem a ser importado manualmente.

    git clone --bare https://github.com/contoso/old-contoso-repo.git
    cd old-contoso-repo.git
    
  2. Crie um repositório de destino usando o TFS 2017 RTM e anote a URL de clone. Neste exemplo, https://dev.azure.com/contoso-ltd/MyFirstProject/_git/new-contoso-repo é a URL para o novo repositório de destino.

  3. Execute o seguinte comando para copiar o repositório de origem para o repositório de destino.

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

    Aviso

    O uso --mirror substituirá todas as ramificações no repositório de destino, o que inclui a exclusão de quaisquer ramificações que não estejam no repositório de origem.

  4. Se o repositório de origem tiver objetos LFS, busque-os e copie-os do repositório de origem para o repositório de destino.

    git lfs fetch origin --all
    git lfs push --all https://dev.azure.com/contoso-ltd/MyFirstProject/_git/new-contoso-repo
    
  5. Exclua a pasta temporária executando os seguintes comandos.

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

Perguntas mais frequentes

Embora na maioria das vezes a importação seja bem-sucedida, as seguintes condições podem causar problemas.

E se meu repositório de origem estiver atrás da autenticação de dois fatores?

O serviço de importação usa APIs REST para validar e disparar a importação e não pode trabalhar diretamente com repositórios que exigem autenticação de dois fatores. A maioria dos provedores de hospedagem Git, como o GitHub e os Serviços de DevOps do Azure, oferece suporte a tokens pessoais que podem ser fornecidos ao serviço de importação.

E se o meu repositório de origem não suportar multi_ack?

O serviço de importação usa a capacidade de multi_ack do protocolo Git durante a importação. Se o repositório de origem não fornecer esse recurso, o serviço de importação poderá falhar ao importar da fonte fornecida. Essa falha pode acontecer ao criar uma solicitação de importação ou enquanto a importação estiver em andamento.

Posso importar de versões anteriores do Team Foundation Server?

Se o repositório Git de origem estiver em uma versão do TFS anterior ao TFS 2017 RTM, a importação falhará. Isso acontece devido a uma incompatibilidade de contrato entre os Serviços de DevOps do Azure/TFS mais recentes e as versões RTM anteriores a 2017 do TFS.

Posso usar credenciais baseadas em MSA?

Infelizmente, as credenciais baseadas em MSA (Conta da Microsoft, anteriormente Live ID) não funcionarão. O serviço de importação depende da autenticação básica para se comunicar com o repositório de origem. Se o nome de usuário / senha que você está usando não são autenticação básica, a autenticação falhará e a importação falhará. Uma maneira de verificar se o nome de usuário / senha que você está usando são autenticação básica ou não é tentar usar o Git para clonar seu repositório usando o formato abaixo

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

Posso importar do TFVC?

Você pode migrar o código de um repositório TFVC existente para um novo repositório Git dentro da mesma conta. Embora a migração para o Git tenha muitos benefícios, é um processo envolvido para grandes repositórios e equipes de TFVC. Sistemas de controle de versão centralizados, como o TFVC, se comportam de maneiras diferentes do Git de maneiras fundamentais. O switch envolve muito mais do que aprender novos comandos. É uma mudança disruptiva que requer um planejamento cuidadoso. Para obter mais informações, consulte Importar do TFVC para o Git.

E se meu repositório de origem contiver objetos Git LFS?

A importação do Git não importará objetos do Git LFS.

Os objetos LFS podem ser movidos usando as seguintes etapas:

  • Importe o repositório usando o recurso de repositório de importação para o Azure DevOps. Isso copiará todos os objetos Git da origem para o Azure DevOps (isso também importará os ponteiros LFS que são objetos Git, mas não os arquivos LFS)

Para mover os arquivos LFS (você precisará do cliente Git.exe e do LFS na mesma caixa e acessar o repositório de origem e o repositório de destino)

  • Clone o repositório importado do Azure DevOps para o sistema local, o clone funcionará, mas falhará ao executar o check-out de arquivos LFS
  • Adicione o repositório de origem como remoto (diga 'source')
  • Executar git lfs fetch source --all (isso trará todos os arquivos LFS do código-fonte para o repositório local)
  • Supondo que o repositório VSTS de destino seja seu remoto de "destino"
  • Executar git lfs push target --all

Posso importar atualizações se a fonte mudar mais tarde?

O serviço de importação é para importar inicialmente um repositório inteiro. Para espelhar alterações posteriores, você precisará de um clone local do repositório com controles remotos definidos para origem e destino.

Você pode sincronizar as alterações usando os seguintes comandos. Trataremos a importação do Azure Repos como origin e o repositório 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

Próximos passos