Condividi tramite


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

Categoria Requisiti
Accesso al progetto Membro di un progetto.
Autorizzazioni - Visualizzare il codice nei progetti privati: almeno livello di accesso Basic .
- Clonare o contribuire al codice nei progetti privati: membro del gruppo di sicurezza Contributors o con autorizzazioni corrispondenti nel progetto.
- Impostare le autorizzazioni per il ramo o il repository: Gestisci le autorizzazioni per il ramo o il repository.
- Modificare il ramo predefinito: Modificare le politiche le autorizzazioni per il repository.
- Importare un repository: membro del gruppo di sicurezza amministratori del progetto o autorizzazione a livello di progetto Git Crea repository impostata su Consenti. Per altre informazioni, vedere Impostare le autorizzazioni del repository Git.
Servizi Repos abilitato.
Strumenti Facoltativo. Usare i comandi az repos: l'interfaccia della riga di comando di Azure DevOps.

Nota

Nei progetti pubblici, gli utenti con accesso Stakeholder hanno pieno accesso ad Azure Repos, compresa la visualizzazione, la clonazione e il contribuire al codice.

Categoria Requisiti
Accesso al progetto Membro di un progetto.
Autorizzazioni - Visualizzare il codice: almeno accesso di base.
- Clonare o contribuire al codice: membro del gruppo di sicurezza Contributor o autorizzazioni corrispondenti nel progetto.
Servizi Repos abilitato.

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 main, viene impostato come ramo predefinito; in caso contrario, il primo ramo (in ordine alfabetico) del repository importato viene impostato come 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

::: moniker-end

Importare in un repository vuoto esistente

Nella pagina File del repository Git vuoto, selezionare Importa e inserire l'URL del clone. Specificare le credenziali se il repository di origine richiede l'autenticazione.

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 include quindi l'autenticazione.
subscription Nome o ID della sottoscrizione. È possibile configurare la sottoscrizione predefinita 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://[email protected]/fabrikamprime/Fabrikam%20Fiber/_git/fabrikam-open-source",
    "size": 12477,
    "sshUrl": "[email protected]: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 nell'aggiornamento 1 2017. È 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 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'utilizzo di --mirror sovrascrive tutti i branch nel repository di destinazione, il che comporta l'eliminazione di eventuali branch non presenti nel repository di origine.

  4. Se il repository di origine include 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

Anche se le importazioni hanno più spesso esito positivo, le condizioni seguenti potrebbero causare problemi.

D: Cosa accade se il repository di origine è protetto dall'autenticazione a due fattori?

R: 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.

D: Cosa accade se il repository di origine non supporta multi_ack?

R: 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.

D: È possibile importare da versioni precedenti?

R: Se il repository Git di origine si trova in una versione TFS precedente a TFS 2017 RTM, l'importazione non riesce. Ciò si verifica a causa di una mancata corrispondenza del contratto tra la versione più recente di Azure DevOps e le versioni precedenti.

D: È possibile usare le credenziali basate su MSA?

R: Sfortunatamente, le credenziali basate su MSA (account Microsoft, in precedenza Live ID) non funzionano. Il servizio di importazione si basa sull'autenticazione di base per comunicare con il repository di origine. Se il nome utente o la password in uso non sono autenticati di base, l'autenticazione e l'importazione hanno 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>>

D: È possibile importare da TFVC?

R: È possibile eseguire la migrazione del codice da un repository TFVC esistente a un nuovo repository Git all'interno dello stesso account. Sebbene la migrazione a Git offra molti vantaggi, è un processo complesso per i repository TFVC di grandi dimensioni e i team. 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.

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

R: L'importazione Git non importa gli oggetti Git LFS.

Gli oggetti LFS possono essere spostati seguendo questa procedura:

  • Importare il repository usando la funzionalità import repository in Azure DevOps. Questa azione copia tutti gli oggetti Git dall'origine ad Azure DevOps, che importa 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 funziona, ma non riesce durante il check-out dei file LFS
  • Aggiungere il repository di origine come remoto, ad esempio "source"
  • Eseguire git lfs fetch source --all, che porta tutti i file LFS dall'origine al repository locale
  • Supponendo che il repository VSTS di destinazione sia il "target" remoto
  • Eseguire git lfs push target --all

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

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

È possibile sincronizzare le modifiche usando i comandi seguenti. L'importazione di Azure Repos viene 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