ファイルの名前を foobar.php から FooBar.php に変更しようとしていますが、これは Git では非常に困難です。ignorecase
これまでのところ、git config の値をtoに設定する必要があることがわかりましたfalse
(Mac OS X で true に設定されたのはなぜですか?)。ローカル リポジトリでこれらのファイルの名前を変更することに成功しましたが、それを BitBucket にプッシュした後は、そこFooBar.php
と同じようになりましfoobar.php
た。これらの重複を取り除くにはどうすればよいですか? ありがとう。
6 に答える
ディレクトリに適用
(ファイル レベルではなく) ディレクトリ レベルでこの問題に苦労していたので、フォルダーに適用されたレシピを次に示します (これは Windows の git v2.9.2 でした)。
- Bitbucketは、 FoobarとFooBarなどの 2 つのサブフォルダーを表示し、その下に異なるファイル/フォルダーがあります。
- クライアント で core.ignorecaseがtrueに設定され、両方のファイル ツリーが共通のルート (たとえば Foobar ) の下で 1 つにマージされました。
- まだcore.ignorecaseをfalseに設定しないでください。別のパスからの「追跡されていない」ファイルが突然残されるためです。
git mv Foobar Foobar.tmp
- 名前が変更されたファイルのセットだけでなく、削除されたファイルのセットと、他のパスからの対応する追跡されていないファイルも取得します。git add .
- 削除された/追跡されていないすべてのファイルをステージングします。- それは私にとってはうまくいきました。これらは削除/追加として表示されますが、それらのファイルの履歴は (魔法のように) 失われません。
git commit -m"syncing Foo[Bb]ar into temp. folder"
- 一時をコミットします。フォルダ。git mv Foobar.tmp FooBar
- temp から名前を変更します。希望の名前に。git commit -m"moving FooBar into place"
- ターゲット名をコミットします。git push
- これで、Bitbucket は単一のサブディレクトリFooBarを表示するはずです。git config [--global] core.ignorecase false
- 二度とその問題に遭遇することはありません。
大文字と小文字を区別するファイル システムにクローン/チェックアウトし (Mac OS X では、大文字と小文字を区別するディスク イメージを作成するだけで済みます)、git rm
必要のない大文字を含むファイルをコピーします。
ignorecase
true に設定された理由については、ドキュメントには次のように記載されています。
core.ignorecase
デフォルトは false ですが、リポジトリの作成時に適切な場合にプローブして true に設定する 場合 を除きgit-clone(1)
ます。git-init(1)
core.ignorecase
あなたの Mac はおそらく大文字と小文字を区別しないファイルシステム (デフォルト)git
を持っているので、それに気づき、適切にフラグを設定するでしょう。
簡単で迅速な修正は、影響するルート フォルダーの名前を前後に変更することです。
例:
mv src src-tmp
git add .
git commit 'step 1'
git push origin your-branch
mv src-tmp src
git add .
git commit 'step 2'
git push origin your-branch
これにより、すべてのファイル ケースの問題が処理されます (ローカル コピーで修正されている場合)。