Importare un repository Git

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

Questo articolo illustra come importare un repository Git esistente da GitHub, Bitbucket, GitLab o un altro percorso in un repository esistente nuovo o vuoto nel progetto Azure DevOps.

Prerequisiti

  • Un'organizzazione in Azure DevOps. Se non ne hai uno, puoi iscriverti gratuitamente. Ogni organizzazione include repository Git privati gratuiti e illimitati.
  • Per creare o importare un repository, è necessario essere membri del gruppo di sicurezza Project Administrators oppure disporre dell'autorizzazione Git project-level Create repository impostata su Consenti. Per altre informazioni, vedere Impostare le autorizzazioni del repository Git.
  • Per usare la funzionalità del repository di importazione di Azure DevOps, è necessario avere TFS 2017 Update 1 o versione successiva.
  • Per importare un repository usando TFS 2017 RTM o versioni precedenti, vedere Importare manualmente un repository usando l'interfaccia della riga di comando git.

Nota

Al termine dell'importazione del repository, Azure DevOps imposta il ramo predefinito per il repository importato. Se il repository importato contiene un ramo denominato master, viene impostato come ramo predefinito. In caso contrario, il primo ramo (in ordine alfabetico) del repository importato è impostato su Predefinito.

Importare in un nuovo repository

  1. Selezionare Repository, File.

    Visualizzare i rami

  2. Nell'elenco a discesa repository selezionare Importa repository.

    Gestire i repository

  3. Se il repository di origine è disponibile pubblicamente, immettere solo l'URL clone del repository di origine e un nome per il nuovo repository Git.

    Se il repository di origine è privato ma è accessibile usando l'autenticazione di base (nome utente-password, token di accesso personale e così via), selezionare Richiede autorizzazione e immettere le credenziali. L'autenticazione SSH non è supportata, ma è possibile importare manualmente un repository che usa l'autenticazione SSH seguendo la procedura descritta in Importare manualmente un repository usando l'interfaccia della riga di comando git.

    Finestra di dialogo Importa repository

Importare in un repository vuoto esistente

Nella pagina File del repository Git vuoto selezionare Importa e immettere l'URL clone. Se il repository di origine richiede l'autenticazione, sarà necessario specificare le credenziali.

Importare un repository in un repository esistente

Nota

La funzionalità di importazione disabilita il collegamento automatico per gli elementi di lavoro menzionati in un commento di commit perché gli ID degli elementi di lavoro nel progetto di destinazione potrebbero non essere uguali a quelli del progetto di origine. Il collegamento automatico per gli elementi di lavoro menzionati in un commit può essere riabilitato passando a Impostazioni, Controllo della versione, selezionando il repository e scegliendo Opzioni. Per altre informazioni sul collegamento di commit con elementi di lavoro, vedere Collegare elementi di lavoro ai commit

Importare manualmente un repository usando l'interfaccia della riga di comando az repos

È possibile usare az repos import per importare un repository nel progetto Azure DevOps.

Nota

Prima di poter importare un repository Git, è necessario creare il repository in Azure DevOps. Inoltre, il repository creato deve essere vuoto. Per creare un repository, vedere Creare il repository Git in Azure Repos.

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

Parametri

Parametro Descrizione
git-source-url Obbligatorio. URL del repository Git di origine da importare.
detect Facoltativo. Rilevare automaticamente l'organizzazione. Valori accettati: false, true.
git-service-endpoint-id Facoltativo. Endpoint servizio per la connessione all'endpoint esterno.
org, organization URL dell'organizzazione di Azure DevOps. È possibile configurare l'organizzazione predefinita usando az devops configure -d organization=<ORG_URL>. Obbligatorio se non è configurato come predefinito o selezionato tramite git config. Esempio: https://dev.azure.com/MyOrganizationName/.
project, p Nome o ID del progetto. È possibile configurare il progetto predefinito usando az devops configure -d project=<NAME_OR_ID>. Obbligatorio se non è configurato come predefinito o selezionato tramite git config.
repository Nome o ID del repository in cui creare la richiesta di importazione.
requires-authorization Flag per indicare se il repository Git di origine è privato. Se è necessaria l'autenticazione, generare un token di autenticazione nel repository di origine e impostare la variabile AZURE_DEVOPS_EXT_GIT_SOURCE_PASSWORD_OR_PAT di ambiente sul valore del token. La richiesta di importazione includerà quindi l'autenticazione.
subscription Nome o ID della sottoscrizione. È possibile configurare la posizione predefinito usando az account set -s <NAME_OR_ID>.
user-name Nome utente da specificare quando il repository Git è privato.

Esempio

Il comando seguente importa il repository pubblico fabrikam-open-source nel repository Git vuoto fabrikam-open-source per la configurazione az devops configure --defaults organization=https://dev.azure.com/fabrikamprime project="Fabrikam Fiber"predefinita.

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

Importare manualmente un repository usando l'interfaccia della riga di comando git

La funzionalità del repository di importazione è stata introdotta in TFS 2017 Update 1. Se si usa TFS 2017 RTM o versioni precedenti, è possibile seguire questa procedura per importare manualmente un repository in TFS. È anche possibile seguire questa procedura per importare manualmente un repository in un repository di Azure DevOps Services sostituendo TFS con Azure Repos nei passaggi seguenti.

  1. Clonare il repository di origine in una cartella temporanea nel computer usando l'opzione bare , come illustrato nell'esempio della riga di comando seguente, quindi passare alla cartella del repository. Quando si clona usando l'opzione bare , il nome della cartella include il .git suffisso . In questo esempio, https://github.com/contoso/old-contoso-repo.git è il repository di origine da importare manualmente.

    git clone --bare https://github.com/contoso/old-contoso-repo.git
    cd old-contoso-repo.git
    
  2. Creare un repository di destinazione usando TFS 2017 RTM e prendere nota dell'URL clone. In questo esempio è https://dev.azure.com/contoso-ltd/MyFirstProject/_git/new-contoso-repo l'URL del nuovo repository di destinazione.

  3. Eseguire il comando seguente per copiare il repository di origine nel repository di destinazione.

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

    Avviso

    L'uso --mirror sovrascriverà tutti i rami nel repository di destinazione che include l'eliminazione di eventuali rami non presenti nel repository di origine.

  4. Se il repository di origine contiene oggetti LFS, recuperarli e copiarli dal repository di origine al repository di destinazione.

    git lfs fetch origin --all
    git lfs push --all https://dev.azure.com/contoso-ltd/MyFirstProject/_git/new-contoso-repo
    
  5. Eliminare la cartella temporanea eseguendo i comandi seguenti.

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

Domande frequenti

Sebbene la maggior parte del tempo in cui l'importazione abbia esito positivo, le condizioni seguenti possono causare problemi.

Cosa accade se il repository di origine si trova dietro l'autenticazione a due fattori?

Il servizio di importazione usa le API REST per convalidare e attivare l'importazione e non può funzionare direttamente con i repository che richiedono l'autenticazione a due fattori. La maggior parte dei provider di hosting Git come GitHub e Azure DevOps Services supportano i token personali che possono essere forniti al servizio di importazione.

Cosa accade se il repository di origine non supporta multi_ack?

Il servizio di importazione usa la funzionalità di multi_ack del protocollo Git durante l'importazione. Se il repository di origine non fornisce questa funzionalità, il servizio di importazione non può eseguire l'importazione dall'origine specificata. Questo errore può verificarsi durante la creazione della richiesta di importazione o durante l'importazione.

È possibile importare da versioni precedenti di Team Foundation Server ?

Se il repository Git di origine si trova in una versione tfs precedente a TFS 2017 RTM, l'importazione avrà esito negativo. Ciò si verifica a causa di una mancata corrispondenza del contratto tra la versione più recente di Azure DevOps Services/TFS e le versioni RTM precedenti al 2017 di TFS.

È possibile usare le credenziali basate su MSA?

Sfortunatamente, le credenziali basate su ACCOUNT MICROSOFT (account Microsoft, in precedenza Live ID) non funzioneranno. Il servizio di importazione si basa sull'autenticazione di base per comunicare con il repository di origine. Se il nome utente/password in uso non è l'autenticazione di base, l'autenticazione avrà esito negativo e l'importazione avrà esito negativo. Un modo per verificare se il nome utente o la password in uso sono l'autenticazione di base o meno consiste nel provare a usare Git per clonare il repository usando il formato seguente

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

È possibile importare da TFVC?

È possibile eseguire la migrazione del codice da un repository TFVC esistente a un nuovo repository Git all'interno dello stesso account. Durante la migrazione a Git offre molti vantaggi, è un processo coinvolto per repository e team TFVC di grandi dimensioni. I sistemi di controllo della versione centralizzati, ad esempio TFVC, si comportano in modo diverso rispetto a Git in modi fondamentali. L'opzione prevede molto di più rispetto all'apprendimento di nuovi comandi. Si tratta di un cambiamento dirompente che richiede un'attenta pianificazione. Per altre informazioni, vedere Importare da TFVC a Git.

Cosa accade se il repository di origine contiene oggetti Git LFS?

L'importazione Git non importerà oggetti Git LFS.

Gli oggetti LFS possono essere spostati seguendo questa procedura:

  • Importare il repository usando la funzionalità import repository in Azure DevOps. In questo modo tutti gli oggetti Git verranno copiati dall'origine ad Azure DevOps( verranno importati anche i puntatori LFS che sono oggetti Git ma non i file LFS)

Per spostarsi sui file LFS (sono necessari sia Git.exe che il client LFS nella stessa casella e l'accesso sia al repository di origine che al repository di destinazione)

  • Clonare il repository importato da Azure DevOps nel sistema locale, il clone funzionerà, ma avrà esito negativo durante l'estrazione dei file LFS
  • Aggiungere il repository di origine come remoto (ad esempio 'source')
  • Eseguire git lfs fetch source --all (verranno eseguiti tutti i file LFS dall'origine al repository locale)
  • Supponendo che il repository VSTS di destinazione sia la destinazione remota
  • Eseguire git lfs push target --all

È possibile importare gli aggiornamenti se l'origine cambia in un secondo momento?

Il servizio di importazione prevede inizialmente l'importazione di un intero repository. Per eseguire il mirroring delle modifiche successive, è necessario un clone locale del repository con remote impostate su origine e destinazione.

È possibile sincronizzare le modifiche usando i comandi seguenti. L'importazione di Azure Repos verrà considerata come origin e il repository originale come 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

Passaggi successivi