40

大文字と小文字のみが異なる同じ名前のファイルを持つUNIXのgitベアリポジトリがあります。

例:

GRANT.sql
grant.sql

Unix から Windows ボックスに裸のリポジトリを複製すると、git status はファイルが変更されていることを検出します。ワーキング ツリーは grant.sql でのみ読み込まれますが、git status は grant.sql と GRANT.sql を比較し、ワーキング ツリーで変更されたファイルを表示します。

core.ignorecase false を使用してみましたが、結果は同じです。

この問題を解決する方法はありますか?

4

7 に答える 7

42

Windowsでは大文字と小文字が区別されません(より正確には、大文字と小文字が区別されます)。名前が大文字と小文字だけが異なる2つのファイルが存在する可能性はありません。大文字と小文字のみが異なる2つのファイル名は同じファイル名です。限目。

そのため、Gitはリポジトリをウォークアウトし、2つの問題のあるファイルの最初の1つに到達するまで、次々にファイルをチェックアウトします。Gitはそれをチェックアウトし、2番目のファイルに到達するまでビジネスをさらに進めます。繰り返しますが、Gitはそれをチェックします。Windowsの観点からは、ファイル名は最初のファイルと同じであるため、最初のファイルは単に2番目のファイルで上書きされます。これにより、Gitは、最初のファイルが2番目のファイルと同じ内容になるように変更されたと見なします。

これはGitとは何の関係もないことに注意してください。tarball、zipファイル、またはSubversionリポジトリがある場合もまったく同じことが起こります。

複数の異なるプラットフォームで開発を行う場合は、それらのプラットフォームの制限を尊重し、サポートするすべてのプラットフォームの最小公分母に限定する必要があります。WindowsはADSをサポートしていますが、Linuxはサポートしていません。OSXはリソースフォークをサポートしていますが、Windowsはサポートしていません。BSDは大文字と小文字の区別をサポートしていますが、Windowsはサポートしていません。したがって、それらのいずれも使用できません。仕方ないよ。

core.ignorecase正反対の問題を処理するため、ここでは役に立ちません。

于 2010-03-27T15:45:08.387 に答える
34

私はちょうど同様の問題に遭遇しました。私の場合、大文字と小文字だけが異なる類似した名前の2つのファイルは、Windowsクローンに関係のないサブディレクトリにありました。Git 1.7には、作業コピーから特定のファイルを除外できるスパースチェックアウト機能があります。このディレクトリを除外するには:

git config core.sparsecheckout true
echo '*' >.git/info/sparse-checkout
echo '!unwanted_dir/' >>.git/info/sparse-checkout
git read-tree --reset -u HEAD

この後、unwanted_dir/サブディレクトリは私の作業コピーから完全に削除され、Gitは残りのファイルを通常どおりに処理し続けます。

GRANT.sqlおよびgrant.sqlがWindowsクローンに関連していない場合は、それらの名前をに追加し.git/info/sparse-checkoutて、それらのファイルを具体的に除外できます。

于 2010-07-23T02:56:06.477 に答える
4

これが可能かどうかさえわかりません。Git の ignorecase は、1 つのファイルの場合の不一致を処理します。Windows では、大文字と小文字だけが異なる 2 つのファイル名を 1 つのディレクトリに含めることができないという問題は回避できません。

FWIW、2 つの同一のファイル名がありますが、Unix であっても、そのケースは本当に悪い考えです。

于 2010-03-27T08:09:28.840 に答える
3

リポジトリを大文字と小文字を区別しないファイル システムに対応させたい場合は、競合するファイルのチェックインを防止するコミット フックを追加できます。

#!/bin/bash

# Save current state
git stash -u -q --keep-index || exit 1

# Get the list of clashing files in the whole repository
CLASHING=`find "$(git rev-parse --show-toplevel)" | sort | uniq -d -i`

# Restore previous state
git stash pop -q

if [[ $CLASHING ]]; then
  echo "Found clashing files on case-insensitive file systems"
  echo "$CLASHING"
  exit 1
fi

exit 0

このスクリプトは、追跡されていないファイルでの失敗を避けるために stash -u を使用するため、git バージョン >= 1.7.7 が必要です。

于 2013-01-02T01:46:03.490 に答える
1

Cygwin は、ファイル名の大文字と小文字の区別と変な文字を MSys よりもはるかに適切に処理します。

このレジストリ キーを変更して、Windows で大文字と小文字を区別できるようにします。

HKLM\System\CurrentControlSet\Control\Session Manager\Kernel\ObCaseInsensitive=0

Cygwin で大文字と小文字の区別がどのようにサポートされているかについての注意事項については、こちらを参照してください。

于 2011-10-16T05:05:20.120 に答える
1

この問題を実際に修正する最も簡単な方法は、Windows や OS X などの大文字と小文字を区別しないファイル システムで競合しないように、いずれかのファイルの名前を変更することです。

問題に最も簡単に対処できる Linux/Unix システムからのコミットに続いて、プル後に Windows ですべてがうまくいきます。この問題の発生を防ぐには、djjeck が提案したのと同様のコミット フックを追加する必要があります。

これに対する Windows の症状は非常に紛らわしく、次のようなものがあります。

  • ファイルを元に戻しても常に変更済みとして表示されるため、ブランチの変更やリベースが非常に困難になります。
  • 両方が git gui で変更を示している場合にのみ、名前が異なるファイルの 2 つのコピー

大文字と小文字を区別しないプラットフォームでは両方のファイルが共存できないため、問題を回避するにはファイル名の 1 つを変更する必要があります。

于 2015-08-04T13:44:30.970 に答える