Compatibilità multipiattaforma Git

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

I file system Windows, macOS e Linux presentano limitazioni e comportamenti che una o più delle altre piattaforme non supportano sempre. Poiché Git è una tecnologia multipiattaforma, è possibile che uno sviluppatore su una piattaforma esemetta un commit contenente file o cartelle con nomi incompatibili con il file system di un'altra piattaforma. La protezione del repository da questa incompatibilità è importante perché gli sviluppatori su altre piattaforme potrebbero controllare inconsapevolmente un commit che danneggia le directory di lavoro a causa di nomi di file o percorsi non supportati.

Azure Repos offre tre impostazioni di compatibilità multipiattaforma che consentono di proteggere il repository dagli utenti che eseguono il push di commit incompatibili con una o più piattaforme. Queste impostazioni sono correlate alle limitazioni seguenti con i file system:

  • Distinzione tra maiuscole e minuscole
  • Restrizioni relative ai nomi di file e cartelle
  • Restrizioni relative alla lunghezza del percorso

Distinzione tra maiuscole e minuscole

I file system Windows e macOS non fanno distinzione tra maiuscole e minuscole (ma conservano maiuscole/minuscole) per impostazione predefinita. La maggior parte dei file system Linux fa distinzione tra maiuscole e minuscole. Git è stato creato originariamente come sistema di controllo della versione del kernel Linux, quindi fa distinzione tra maiuscole e minuscole.

Anche se Git per Windows risolve molti dei problemi relativi a un sistema operativo senza distinzione tra maiuscole e minuscole, rimangono alcune stranezze.

Nomi di file e cartelle

In Linux, il controllo di un repository Git che contiene sia File.txtche file.txt non è un problema. Si tratta di nomi di file distinti. In Windows e macOS, il estrazione di entrambi i file causa la sovrascrittura del secondo. Se due cartelle differiscono solo per caso, il relativo contenuto viene combinato in file system senza distinzione tra maiuscole e minuscole.

Esistono due modi per correggere un repository con conflitti tra maiuscole e minuscole:

  • Controllare il repository in un ambiente con distinzione tra maiuscole e minuscole. Rinominare file e cartelle in modo che non siano più in conflitto e quindi eseguirne il push nel repository. sottosistema Windows per Linux è un ambiente di questo tipo.
  • Usare il comando git mv -f <conflicting name> <non-conflicting name> per ogni conflitto. Prestare attenzione a usare l'esatta combinazione di maiuscole e minuscole su entrambi i nomi di file.

È consigliabile evitare di creare conflitti tra maiuscole e minuscole. Azure Repos offre un'impostazione di imposizione dei casi per evitare push che causerebbero questa situazione. Per gli sviluppatori, anche l'adozione dell'abitudine di usare il completamento tramite tabulazione per eseguire il commit dei file sarà utile. Poiché sia Windows che macOS conservano le maiuscole e minuscole, questi approcci assicurano che gli interni di Git visualizzino esattamente la stessa combinazione di maiuscole e minuscole usata dal file system.

Nomi di rami e tag

È possibile creare due rami o tag (noti come riferimenti) che differiscono solo in maiuscolo. Gli interni di Git, insieme ad Azure DevOps Services e Azure DevOps Server, li considerano come due riferimenti separati. Nel computer di un utente Git usa il file system per archiviare i riferimenti. Le operazioni di recupero e altre operazioni iniziano a non riuscire a causa dell'ambiguità.

Un file di piccole dimensioni rappresenta ogni riferimento. Se un nome di riferimento contiene caratteri barra (/), le cartelle rappresentano le parti prima della barra finale.

Un modo semplice per evitare problemi consiste nell'usare sempre i nomi di tag e di ramo in lettere minuscole. Se sono già stati creati due rami o tag con questo problema, è possibile risolverli nell'interfaccia utente Web di Azure Repos.

Per correggere i nomi dei rami:

  1. Nella pagina per i rami passare al commit correlato.
  2. Nel menu di scelta rapida selezionare Nuovo ramo.
  3. Assegnare al ramo un nuovo nome che non ha un conflitto tra maiuscole e minuscole.
  4. Tornare alla pagina per i rami ed eliminare il ramo in conflitto.

Per correggere i nomi dei tag:

  1. Nella pagina per i tag passare al commit con tag.
  2. Nel menu di scelta rapida selezionare Crea tag.
  3. Assegnare al tag un nuovo nome che non ha un conflitto tra maiuscole e minuscole.
  4. Tornare alla pagina per i tag ed eliminare il tag in conflitto.

Restrizioni relative a percorso e nome file

I sistemi operativi Windows, macOS e Linux presentano varie limitazioni per i nomi e i percorsi dei file. Queste limitazioni limitano ciò che è possibile denominare file o cartelle, che possono creare problemi per i team che usano Git su più piattaforme.

Si supponga, ad esempio, che uno sviluppatore in una piattaforma esemplifichi una modifica al repository condiviso contenente un nome file o una lunghezza del percorso non valida in un'altra piattaforma. Successivamente, un altro sviluppatore tenta di controllare il commit in una piattaforma in cui il contenuto non è valido. Questa situazione causa una directory di lavoro danneggiata che può danneggiare il repository con dati danneggiati.

Azure Repos offre impostazioni del repository che bloccano i push contenenti commit che violano una o più delle limitazioni seguenti.

Tabella di riferimento per i nomi e i percorsi dei file

Restrizioni/piattaforme Windows macOS Linux
Restrizioni relative ai nomi di file Nomi di file riservati: CON, PRN, AUX, NUL, COM1-COM9, LPT1-LPT9

Nomi di file riservati seguiti da .

Caratteri riservati: \ / : * ? " < >

Nomi di file che terminano in . o spazi vuoti
Nomi di file che terminano / Nomi di file che terminano /
Restrizioni relative alla lunghezza del percorso I percorsi in Windows hanno una lunghezza massima di 260 caratteri (incluso un carattere di terminazione Null).

Per le directory con .NET, il nome di file completo deve essere composto da meno di 260 caratteri e il nome della directory deve contenere meno di 248 caratteri.
I nomi dei file sono limitati a 255 caratteri.

I valori massimi di percorso in HFS+ sono documentati come illimitati, anche se alcuni percorsi limite delle versioni macOS a 1.016 caratteri. Alcuni file system supportano 1.016 come valore massimo di percorso.
I nomi dei file sono limitati a 255 caratteri.

Il percorso massimo è 4096.

Supporto per la codifica

Nota

Il supporto della codifica descritto in questa sezione è supportato in Azure DevOps Server 2019.1 e versioni successive.

Microsoft ha aggiunto il supporto per la codifica UTF-16 e UTF-32 tramite l'endpoint push Web. Questo supporto significa che il tipo di codifica viene mantenuto, quindi non è necessario riscrivere i file come UTF-8. Viene visualizzato anche un avviso quando si tenta di salvare un file che non è codificato tramite il Web (che supporta solo la codifica UTF).

Lo screenshot seguente mostra un esempio della finestra di dialogo visualizzata quando si introducono modifiche di codifica usando un push Web.

Screenshot che mostra la finestra di dialogo sull'introduzione delle modifiche di codifica tramite un push Web.