Git の大文字小文字の区別

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

Windows および macOS ファイル システムでは、大文字と小文字は既定では区別されません (ただし、大文字と小文字は保持されます)。 ほとんどの Linux ファイルシステムでは、大文字と小文字が区別されます。 Git はもともと Linux カーネルのバージョン コントロール システムとして構築されたため、当然ながら大文字と小文字が区別されます。

大文字と小文字を区別しない OS に関する問題の多くは Git for Windows で解決されていますが、いくつかの問題が残っています。

ファイルとフォルダーの名前

Linux では、"File.txt" と "file.txt" の両方を含む Git リポジトリをチェックアウトしても問題ありません。 これらは個別のファイル名です。 Windows と macOS では、両方のファイルをチェックアウトすると、2 番目のファイルによって最初のファイルが上書きされます。 2 つのフォルダーが大文字と小文字のみが異なる場合、大文字と小文字を区別しないファイル システムでは、それらの内容が混在してしまいます。

大文字と小文字の競合を修正する

この問題があるリポジトリを解決する方法の 1 つは、大文字と小文字を区別する環境でそのリポジトリをチェックすることです。 ファイルとフォルダーの名前を変更して競合しないようにし、それらの変更をリポジトリにプッシュします。 Linux 用 Windows サブシステムはそのような環境の 1 つです。 もう 1 つの方法は、両方のファイル名で正確に大文字を使用するように注意しながら、競合ごとにコマンド git mv -f <conflicting name> <non-conflicting name> を使用することです。

大文字と小文字の競合を回避する

そもそもこのような状況を作らないようにすることをお勧めします。 Azure Repos には、この状況を引き起こす可能性のあるプッシュを防止するための大文字と小文字の区別の強制設定が用意されています。 開発者には、タブ補完を使用したファイルのコミットを習慣付けることも役立ちます。 Windows と macOS ではどちらも大文字と小文字が保持されるため、Git の内部ではファイルシステムで使用されるものとまったく同じ大文字と小文字の区別が使用されます。

ブランチとタグの名前

大文字と小文字のみが異なる 2 つのブランチまたはタグ ("ref" と呼ばれます) を作成できます。 Git の内部と Azure DevOps Services/TFS では、それらが 2 つの別々の ref として扱われます。 ユーザーのマシンでは、Git はファイルシステムを使用して refs を格納します。 あいまいさが原因でフェッチやその他の操作が失敗し始めます。 各 ref は小さなファイルで表され、ref 名に / 文字が含まれている場合、最後の / より前の部分はフォルダーで表されます。

問題を回避する簡単な方法の 1 つは、ブランチとタグの名前を常にすべて小文字にすることです。 この問題がある 2 つのブランチまたはタグを既に作成している場合は、Azure Repos Web UI で修正できます。

ブランチ名を修正する

ブランチ ページから、関連するコミットに移動します。 コンテキスト メニューで [新しいブランチ] を選択します。 ブランチに、大文字と小文字の競合がない新しい名前を付けます。 ブランチ ページに戻り、競合しているブランチを削除します。

タグ名を修正する

タグ名を修正する手順は、ブランチに似ています。 タグ ページから、タグ付けされたコミットに移動します。 コンテキスト メニューで [タグの作成] を選択します。 タグに、大文字と小文字の競合がない新しい名前を付けます。 [タグ] ページに戻り、競合しているタグを削除します。