2011-12-09 2 views
9

私たちはオフィスのLinuxサーバにあるリモートGitリポジトリを使用しています。すべてのクライアントは、Git ExtensionsがクライアントとしてインストールされているWindows PCです(msysgitで動作します)。クライアントシステムでLinux上で "git branch"を "core.ignorecase"フラグにするには?

、私は次の操作を実行しようとした場合:

git branch Branch1 
git branch branch1 

2番目のコマンドは、その名前のブランチがすでに存在していることを私に言って、失敗するだろう。それはgit configcore.ignorecaseをtrueに設定しているので、私が期待していることです。

しかし、Linuxシステムに直接ログオンして同じコマンドを実行すると、core.ignorecaseフラグがtrueに設定されていても、両方のブランチが作成されます。

私はリポジトリが大文字小文字を無視するように設定していたので、2番目のコマンドも失敗すると思っていましたが、フラグはLinuxシステムでは何もしませんでした。

すぐにソースセーフからGitへのSCMの移行を計画しているので、誰も私がこの問題を理解するのを助けることができます。この問題は私たちを驚かせています。 2人の開発者が同じ名前のブランチを作成して別のケースを作成し、結果をLinuxリポジトリにプッシュするとどうなりますか?

+0

@meagarが正しいです。ブランチ名の一貫したケーシングを強制し、大文字小文字を除いて同じ名前のものを避けるのが一般的です。しかしメモとして、HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ kernel \ obcaseinsensitiveを設定するWindowsレジストリは、明らかにgitが望むように動作することを許可します(私はcygwinを通してgitを使用しています; msysgitが同じように動作するかどうかは不明です) )。 –

答えて

15

私は、@ meagarの答えの上に詳細を追加したいと思います:

FAT32/NTFSはcase-preservingファイルシステムです。つまり、ファイル名を "Foo.txt"とすると、 "Foo.txt"として保存されます。ファイルを "foo.txt"として保存すると、 "foo.txt"として保存されますが、

Windowsのリポジトリでは、「Foo.txt」と「foo.txt」は大文字と小文字を区別しないため、「Foo.txt」と「foo.txt」の両方を同じディレクトリに置くことはできません。 Foo.txt "を" foo.txt "に変更し、それを変更として表示しない場合は、core.ignorecaseの設定をtrueに設定するとgitは変更を表示しません。falseに設定すると、 (ただし、ファイルシステムとgitの性質上、foo.txtという新しいファイルが追加され、Windows上で混乱することになります)

これは、この目的のためですcore.ignorecase

支店に来る。ブランチはコミットのポインタです。これらのポインタは単なるファイルです。これらのファイルは.git/refs/headsに格納されています。ブランチを作成するとき、たとえばbarというと、.git/refs/head/barという名前のファイルが作成されます。 Linuxでは、Barという名前のブランチを作成すると、ファイル.git/refs/head/Barが作成され、ブランチの作成が可能になります。しかし、Windowsでは.git/refs/head/Barを作成することはできません。したがって、バーが存在するときには、バーブランチを作成することはできません。 core.ignorecaseはリポジトリ内のファイル(コードベース)に関係し、gitのメタデータファイルには影響しないことを理解してください。

Linuxでは、同じ名前のブランチを作成することができますが、大文字と小文字が区別されますが、Windowsではできません。

+0

ありがとうございます。私はまだGitに慣れていないので、ブランチがシンプルなメタダダファイルであることは分かりませんでした。私はすでにLinuxとWindowsの間の大文字と小文字の区別の違いを知っていましたが、コードファイルとLinuxのブランチ間の大文字と小文字の区別の違いを理解することは困難でした。今分かります。 – franmon

8

"git branch"をLinuxの "core.ignorecase"フラグにするにはどうすればいいですか?

フラグはあなたが思うと思わないので、できません。

core.ignorecase

trueの場合、このオプションはFATのように、大文字と小文字を区別しませんファイルシステムでよりよく動作するようにgitのを可能にするために、さまざまな回避策を可能にします。

core.ignorecaseあなたが記述している行動とは何の関係もありません、それはブランチ名の大文字と小文字の区別とは無関係です。 WindowsでBranch1branch1の違いを教えてもらえませんでしたが、core.ignorecaseが設定されているかどうかに関係なく、同じ方法で動作します。

...しかし、Linuxシステムではフラグは何もしません。または何かが見つかりませんでした。

あなたは何も見逃さなかった。このフラグはLinuxシステムでは何もしません。 core.ignorecaseは、大文字と小文字を区別しないオペレーティングシステムを作るためのものではありません.Gitがの壊れたのオペレーティングシステムで動作するようにしています。 Linuxは基本的には大文字と小文字を区別しますので、Gitもそうです。これを使用して作業し、開発者がブランチ名に小文字を使用するように指示する必要があります。 で、Gitは他のオペレーティングシステムから壊れた動作をエミュレートしようとしているはずです。

2人の開発者が同じ名前でブランチを作成して別のケースを作成し、その結果をLinuxリポジトリにプッシュするとどうなりますか?

次に、2つの完全に異なるブランチ、誤ってという名前だった、と誰かが自分の間違っブランチをマージして捨てることを余儀なくされるだろう小文字と1の1を持っているでしょう。これはGitを使用することの副作用として、あなたが日常的にやっていることです。

+0

WindowsとMac OS Xが根本的に「大文字と小文字を区別しないオペレーティングシステム」であるという表現は役に立たない。同様に役に立たないが、ファイルシステムの機能を認識せずにファイルシステムに直接ファイル名としてブランチ名を格納することで、gitがうまく設計されていないと主張する方が合理的である。 – ctpenrose

+0

Gitがすべてのオペレーティングシステムの風変わりな動作で正規化する必要がある場合、これは決して終了しませんでした。答えは立つ。 – meagar

+0

あなたの説明に基づいて、プロパティは "core.forcecase"のような名前になっているはずです。 OPのように、システムが大文字と小文字を区別しないようにするために、 "ignorecase"というフラグも期待していました。 – thelr

関連する問題