Compatibilidade entre plataformas Git

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

Os sistemas de arquivos Windows, macOS e Linux têm limitações e comportamentos que uma ou mais das outras plataformas nem sempre suportam. Como o Git é uma tecnologia multiplataforma, é possível que um desenvolvedor em uma plataforma faça uma confirmação que contenha arquivos ou pastas que tenham nomes incompatíveis com o sistema de arquivos de outra plataforma. Proteger seu repositório contra essa incompatibilidade é importante porque os desenvolvedores em outras plataformas podem, sem saber, verificar uma confirmação que corrompe seus diretórios de trabalho devido a nomes de arquivos ou caminhos sem suporte.

O Azure Repos oferece três configurações de compatibilidade multiplataforma que ajudam a proteger seu repositório contra pessoas que fazem push de commits incompatíveis com uma ou mais plataformas. Essas configurações estão relacionadas às seguintes limitações com sistemas de arquivos:

  • Diferenciar maiúsculas de minúsculas
  • Restrições sobre nomes de arquivos e pastas
  • Restrições de comprimento do caminho

Diferenciar maiúsculas de minúsculas

Os sistemas de arquivos windows e macOS não diferenciam maiúsculas de minúsculas (mas preservam maiúsculas e minúsculas) por padrão. A maioria dos sistemas de arquivos baseados em Linux diferenciam maiúsculas de minúsculas. O Git foi construído originalmente para ser o sistema de controle de versão do kernel Linux, por isso diferencia maiúsculas de minúsculas.

Embora o Git para Windows resolva muitos dos problemas com um sistema operacional que não diferencia maiúsculas de minúsculas, algumas peculiaridades permanecem.

Nomes de arquivos e pastas

No Linux, fazer check-out de um Repositório do Git que contém File.txt e file.txt não é problema. Esses Esses são nomes de arquivo distintos. No Windows e macOS, o check-out de ambos os arquivos faz com que o segundo substitua o primeiro. Se duas pastas diferirem apenas por maiúsculas e minúsculas, seu conteúdo será misturado em sistemas de arquivos que não diferenciam maiúsculas de minúsculas.

Há duas maneiras de corrigir um repositório que tem conflitos de maiúsculas e minúsculas:

  • Faça check-out do repositório em um ambiente que diferencia maiúsculas de minúsculas. Renomeie arquivos e pastas para que eles não entrem mais em conflito e, em seguida, envie essas alterações para o repositório. O Subsistema do Windows para Linux é um desses ambientes.
  • Use o comando git mv -f <conflicting name> <non-conflicting name> para cada conflito. Tenha cuidado para usar maiúsculas exatas em ambos os nomes de arquivo.

É bom evitar criar conflitos de caso em primeiro lugar. O Azure Repos oferece uma configuração de imposição de maiúsculas e minúsculas para evitar pushes que levariam a essa situação. Para os desenvolvedores, adotar o hábito de usar a conclusão de tabulação para confirmar arquivos também ajudará. Como o Windows e o macOS preservam maiúsculas de minúsculas, essas abordagens garantem que os internos do Git vejam exatamente o mesmo invólucro que o sistema de arquivos usa.

Nomes de branch e marca

Você pode criar dois branches ou tags (conhecidas como refs) que diferem apenas no uso de maiúsculas e minúsculas. Os internos do Git, juntamente com o Azure DevOps Services e o Azure DevOps Server, os tratam como duas refs separadas. No computador de um usuário, o Git usa o sistema de arquivos para armazenar refs. Buscas e outras operações começam a falhar devido à ambiguidade.

Um pequeno arquivo representa cada ref. Se um nome de referência contiver caracteres de barra (/), as pastas representarão as partes antes da barra final.

Uma maneira simples de evitar problemas é sempre usar nomes de branches e tags minúsculos. Se você já criou dois branches ou tags com esse problema, poderá corrigi-las na interface do usuário da Web do Azure Repos.

Para corrigir nomes de ramificações:

  1. Na página de branches, vá para o commit relacionado.
  2. No menu de atalho, selecione New branch.
  3. Dê ao branch um novo nome sem conflitos de maiúsculas e minúsculas.
  4. Retorne à página de branches e exclua o branch conflitante.

Para corrigir nomes de tags:

  1. Na página de tags, vá para o commit marcado.
  2. No menu de atalho, selecione Criar tag.
  3. Dê à marca um novo nome sem conflitos de maiúsculas e minúsculas.
  4. Retorne à página para tags e exclua a tag conflitante.

Restrições de nome de arquivo e caminho

Os sistemas operacionais Windows, macOS e Linux têm várias limitações para nomes de arquivos e caminhos. Essas limitações restringem o que você pode nomear arquivos ou pastas, o que pode criar problemas para equipes que usam o Git em várias plataformas.

Por exemplo, imagine que um desenvolvedor em uma plataforma confirme uma alteração no repositório compartilhado que contém um nome de arquivo ou comprimento de caminho inválido em outra plataforma. Mais tarde, outro desenvolvedor tenta verificar esse commit em uma plataforma onde o conteúdo é inválido. Essa situação resulta em um diretório de trabalho corrompido que tem o potencial de danificar seu repositório com dados corrompidos.

O Azure Repos oferece configurações de repositório que bloqueiam pushes contendo confirmações que violam uma ou mais das seguintes limitações.

Tabela de referência para nomes de arquivo e caminhos

Restrições/Plataformas Windows macOS Linux
Restrições de nome de arquivo Nomes de arquivo reservados: CON, PRN, AUX, NUL, COM1 - COM9, LPT1 - LPT9

Nomes de arquivo reservados seguidos por .

Caracteres reservados: \ / : * ? " < >

Nomes de arquivo que terminam em . ou espaço em branco
Nomes de arquivo que terminam em / Nomes de arquivo que terminam em /
Restrições de comprimento do caminho Os caminhos no Windows têm um comprimento máximo de 260 caracteres (incluindo um terminador nulo).

Para diretórios com .NET, o nome de arquivo totalmente qualificado deve ter menos de 260 caracteres e o nome do diretório deve ter menos de 248 caracteres.
Os nomes das consultas são limitados a 255 caracteres.

Os máximos de caminho no HFS+ são documentados como ilimitados, embora algumas versões do macOS limitem os caminhos em 1.016 caracteres. Alguns sistemas de arquivos suportam 1.016 como o caminho máximo.
Os nomes das consultas são limitados a 255 caracteres.

O caminho máximo é 4096.

Suporte à codificação

Observação

O suporte de codificação descrito nesta seção tem suporte no Azure DevOps Server 2019.1 e posterior.

A Microsoft adicionou suporte para codificação UTF-16 e UTF-32 por meio do ponto de extremidade de push da Web. Esse suporte significa que preservamos o tipo de codificação, para que você não precise reescrever seus arquivos como UTF-8. Você também verá um aviso ao tentar salvar um arquivo que não é codificado em UTF via Web (que suporta apenas codificação UTF).

A captura de tela a seguir mostra um exemplo da caixa de diálogo que aparece quando você introduz alterações de codificação usando um web push.

Captura de tela que mostra a caixa de diálogo sobre a introdução de alterações de codificação por meio de notificações por push da Web.