Git 플랫폼 간 호환성

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

Windows, macOS 및 Linux 파일 시스템에는 하나 이상의 다른 플랫폼이 항상 지원하지 않는 제한 사항과 동작이 있습니다. Git은 플랫폼 간 기술이므로 한 플랫폼의 개발자가 다른 플랫폼의 파일 시스템과 호환되지 않는 이름을 가진 파일 또는 폴더가 포함된 커밋을 만들 수 있습니다. 다른 플랫폼의 개발자가 지원되지 않는 파일 또는 경로 이름으로 인해 작업 디렉터리를 손상시키는 커밋을 무의식적으로 검사 수 있으므로 이 비호환성으로부터 리포지토리를 보호하는 것이 중요합니다.

Azure Repos는 하나 이상의 플랫폼과 호환되지 않는 커밋을 푸시하는 사용자로부터 리포지토리를 보호하는 데 도움이 되는 세 가지 플랫폼 간 호환성 설정을 제공합니다. 이러한 설정은 파일 시스템의 다음과 같은 제한 사항과 관련이 있습니다.

  • 대/소문자 구분
  • 파일 및 폴더 이름에 대한 제한 사항
  • 경로 길이 제한

대/소문자 구분

Windows 및 macOS 파일 시스템은 기본적으로 대/소문자를 구분하지 않지만 대/소문자를 유지합니다. 대부분의 Linux 파일 시스템은 대/소문자를 구분합니다. Git은 원래 Linux 커널의 버전 제어 시스템으로 빌드되었으므로 대/소문자를 구분합니다.

Windows용 Git은 대/소문자를 구분하지 않는 운영 체제의 많은 문제를 해결하지만 몇 가지 단점이 다시 기본.

파일 및 폴더 이름

Linux에서 File.txt 및 file.txt 모두 포함하는 Git 리포지토리를 검사 것은 문제가 되지 않습니다. 이러한 이름은 고유한 파일 이름입니다. Windows 및 macOS에서 두 파일을 모두 검사 두 번째 파일을 덮어쓰게 됩니다. 두 폴더가 대/소문자만 다른 경우 해당 콘텐츠는 대/소문자를 구분하지 않는 파일 시스템에서 함께 혼합됩니다.

사례 충돌이 있는 리포지토리를 수정하는 방법에는 두 가지가 있습니다.

  • 대/소문자를 구분하는 환경에서 리포지토리를 확인합니다. 더 이상 충돌하지 않도록 파일 및 폴더의 이름을 바꾼 다음 해당 변경 내용을 리포지토리에 푸시합니다. Linux용 Windows 하위 시스템 그러한 환경 중 하나입니다.
  • 각 충돌에 대한 명령을 git mv -f <conflicting name> <non-conflicting name> 사용합니다. 두 파일 이름 모두에 정확한 대/소문자를 사용해야 합니다.

처음에 사례 충돌을 만들지 않는 것이 좋습니다. Azure Repos는 이러한 상황으로 이어질 푸시를 방지하기 위해 사례 적용 설정을 제공합니다. 개발자의 경우 탭 완성을 사용하여 파일을 커밋하는 습관을 채택하는 것도 도움이 됩니다. Windows와 macOS는 모두 대/소문자를 유지하므로 이러한 접근 방식을 통해 Git의 내부는 파일 시스템에서 사용하는 것과 정확히 동일한 대/소문자를 볼 수 있습니다.

분기 및 태그 이름

대/소문자만 다른 두 개의 분기 또는 태그(refs라고 함)를 만들 수 있습니다. Git의 내부는 Azure DevOps Services 및 Azure DevOps Server와 함께 두 개의 별도 참조로 처리합니다. 사용자의 컴퓨터에서 Git은 파일 시스템을 사용하여 refs를 저장합니다. 페치 및 기타 작업은 모호성으로 인해 실패하기 시작합니다.

작은 파일은 각 ref를 나타냅니다. ref 이름에 슬래시() 문자가/ 포함된 경우 폴더는 마지막 슬래시 앞의 부분을 나타냅니다.

문제를 방지하는 간단한 방법 중 하나는 항상 모든 소문자 분기 및 태그 이름을 사용하는 것입니다. 이 문제가 있는 두 개의 분기 또는 태그를 이미 만든 경우 Azure Repos 웹 UI에서 수정할 수 있습니다.

분기 이름을 수정하려면 다음을 수행합니다.

  1. 분기 페이지에서 관련 커밋으로 이동합니다.
  2. 바로 가기 메뉴에서 새 분기를 선택합니다.
  3. 분기에 대/소문자 충돌이 없는 새 이름을 지정합니다.
  4. 분기의 페이지로 돌아가서 충돌하는 분기를 삭제합니다.

태그 이름을 수정하려면 다음을 수행합니다.

  1. 태그에 대한 페이지에서 태그가 지정된 커밋으로 이동합니다.
  2. 바로 가기 메뉴에서 태그 만들기를 선택합니다.
  3. 태그에 대/소문자 충돌이 없는 새 이름을 지정합니다.
  4. 태그에 대한 페이지로 돌아가서 충돌하는 태그를 삭제합니다.

경로 및 파일 이름 제한

Windows, macOS 및 Linux 운영 체제에는 파일 이름 및 경로에 대한 다양한 제한 사항이 있습니다. 이러한 제한 사항은 파일 또는 폴더의 이름을 지정할 수 있는 항목을 제한하므로 여러 플랫폼에서 Git을 사용하는 팀에 문제가 발생할 수 있습니다.

예를 들어 한 플랫폼의 개발자가 다른 플랫폼에서 잘못된 파일 이름 또는 경로 길이가 포함된 공유 리포지토리에 대한 변경 내용을 커밋한다고 상상해 보십시오. 나중에 다른 개발자는 콘텐츠가 잘못된 플랫폼에서 해당 커밋을 검사 시도합니다. 이로 인해 손상된 데이터로 리포지토리가 손상될 가능성이 있는 손상된 작업 디렉터리가 발생합니다.

Azure Repos는 다음 제한 사항 중 하나 이상을 위반하는 커밋을 포함하는 푸시를 차단하는 리포지토리 설정을 제공합니다.

파일 이름 및 경로에 대한 참조 테이블

제한 사항/플랫폼 Windows macOS Linux
파일 이름 제한 예약된 파일 이름: CON, PRN, AUX, NUL, COM1-COM9, LPT1-LPT9

예약된 파일 이름 뒤에 .

예약 문자: \ / : * ? " < >

공백 또는 공백으로 . 끝나는 파일 이름
끝나는 파일 이름 / 끝나는 파일 이름 /
경로 길이 제한 Windows 의 경로 길이는 최대 260자(null 종결자 포함)입니다.

.NET이 있는 디렉터리의 경우 정규화된 파일 이름은 260자 미만이어야 하며 디렉터리 이름은 248자 미만이어야 합니다.
파일 이름은 255자로 제한됩니다.

HFS+의 경로 최대값은 무제한으로 문서화되지만 일부 macOS 버전은 경로를 1,016자로 제한합니다. 일부 파일 시스템은 경로 최대값으로 1,016을 지원합니다.
파일 이름은 255자로 제한됩니다.

경로 최대값은 4096입니다.

인코딩 지원

참고 항목

이 섹션에서 설명하는 인코딩 지원은 Azure DevOps Server 2019.1 이상에서 지원됩니다.

Microsoft는 웹 푸시 엔드포인트를 통해 UTF-16 및 UTF-32 인코딩에 대한 지원을 추가했습니다. 이 지원은 인코딩 형식을 유지하므로 파일을 UTF-8로 다시 작성할 필요가 없다는 것을 의미합니다. 또한 웹을 통해 인코딩된 UTF가 아닌 파일을 저장하려고 할 때(UTF 인코딩만 지원) 경고가 표시됩니다.

다음 스크린샷은 웹 푸시를 사용하여 인코딩 변경 내용을 도입할 때 나타나는 대화 상자의 예를 보여 줍니다.

웹 푸시를 통해 인코딩 변경 내용을 도입하는 방법에 대한 대화 상자를 보여 주는 스크린샷