git mvとディレクトリの大文字と小文字のみを変更


259

同様の質問を見つけましたが、問題の答えが見つかりませんでした

git mv FOO foo私が 経由してFOOからfooにディレクトリの名前を変更しようとすると

fatal: renaming 'FOO' failed: Invalid argument

OK。だから私はgit mv FOO foo2 && git mv foo2 foo

しかし、私がコミットしようとするgit commit .と、

# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
# foo
nothing added to commit but untracked files present (use "git add" to track)

git add foo何も変更せずにディレクトリを追加するとgit commit .、同じメッセージが再度表示されます。

何が悪いのですか?大文字と小文字を区別するシステム(OSX)を使用していると思いましたが、ディレクトリの名前を変更できないのはなぜですか?


10
OS Xのファイルシステムでは、大文字と小文字は区別されません。
mipadi

2
@mipadi大文字と小文字を区別するモードで動作しますが、通常はデフォルトでオフになっています。
GordonM

1
この質問とその回答は、Windowsでも役立ちます。「osx」のタグ付けを解除することを検討してください
Barett

1
stackoverflow.com/a/24979063/6309を参照してください:git 2.0.1以降、簡単にgit mv機能します。
VonC、2015年

Windowsでは、cyowin git mv foo Fooシェルを使用している場合、youoは通常のものを使用できます。
アンドリュースコット

回答:


409

大文字と小文字を区別しない環境にいます。さらに、Gitが理解している-Aように、withを追加しなくても、の削除側は処理されませんmv警告!これを行うときは、他の変更や追跡されていないファイルがないことを確認してください。そうしないと、この変更の一部としてコミットされます。 git stash -u最初にこれを実行し、その後git stash popに実行します。続行:これを回避するには、次の手順を実行します。

mv foo foo2
git add -A
git commit -m "renaming"
mv foo2 FOO
git add -A
git commit --amend -m "renamed foo to FOO"

これが、作業ディレクトリを変更してコミットし、2つのコミットを折りたたむ方法です。インデックス内のファイルを移動するだけでかまいませんが、gitを初めて使用するユーザーにとっては、何が起こっているのかが十分に明確でない場合があります。短いバージョンは

git mv foo foo2
git mv foo2 FOO
git commit -m "changed case of dir"

コメントの1つで提案されているように、インタラクティブなリベースを実行して(git rebase -i HEAD~5間違ったケースが5コミット前に導入された場合)、そこでケースを修正し、履歴のどこにも間違ったケースが表示されないようにすることもできます。それ以降のコミットハッシュは異なり、他の人は自分の作業をブランチの最近の過去とリベースまたは再マージする必要があるため、これを行う場合は注意する必要があります。

これはファイル名の修正に関連しています:gitは大文字と小文字を区別しませんか?


1
ありがとう。これは私を夢中にさせていました。-Aまたは--amendオプションについては知りませんでした。
オシュレンク2010年

7
-Aには注意が必要です。追跡されていないものも含め、現在のディレクトリ内のすべてのコンテンツが再帰的に追加されるためです。ちょうど良いかもしれませんgit add foo2
rich.e

2
それは正しいです。ただし、foo2の削除とFOOの追加の両方を個別にステージングする必要があります。-A両方を処理します。最初のステップはその逆です。警告を追加します。ありがとう!
Adam Dymitruk、

インタラクティブなリベースで履歴をクリーンアップすることもできますgit rebase -i HEAD~2。注:これを簡略化するには、最初のコミットで最後のメッセージを設定し、2番目のコミットを修正します。
Alex B.

5
私はgit mv foo foo2で成功しました。git mv foo2 FOO; git commit
Chris

146

このオプションcore.ignorecaseをfalse に設定すると、ネイティブでサポートされていないファイルシステムのケースにGitが注意を向けます。リポジトリで有効にするには:

$ git config core.ignorecase false

次に、ファイルの名前を変更できgit mv、期待どおりに機能します。


1
これは他の場所に望ましくない影響を与える可能性があると思います。大文字と小文字を区別しないシステムでは、Gitが同じディレクトリであると見なす必要があります。
Adam Dymitruk、2010年

2
グローバル構成にオプションを追加しましたが、
役に立ち

3
これをOSXで使用すると、奇妙な動作が見られます。hrm I modified a file that doesn't exist.. hrm error: The following untracked working tree files would be overwritten by checkout:しかし...これらのファイルは存在しません。
Skylar Saveland、2011

これはまさに私が探していたものでした。CentOS 5.6を実行していますが、大文字と小文字の変更が反映されませんでした。
crmpicco 14

5
これは機能しません!Git 1.8.3では、Gitは名前が変更されたファイルを削除+追加するのではなく、新しいファイルとして扱います。これをコミットすると、リポジトリに2つの同じファイルが残ります。たとえば、fooとFOOの両方が存在します。ただし、チェックアウト時に表示されるファイルは1つだけです(ただし、1つのケースが他のケースよりも優先される場合があります)
Johnny Wong

68

これを解決するには、一時的なファイル名を使用してgit 1.7.7を使用します。

$ git mv improper_Case improve_case2
$ git mv improve_case2 improve_case
$ git commit -m "<your message>"

面白い。それ以来、GITは何かを改善したのかもしれません。この問題に再び遭遇したら、もう一度試してみます。
oschrenk

この方法を使用するほうがはるかに簡単です
olore

macOSで私のために働いた。
Mr_Pouet

14

git mv-freeバリアント。)

Mac OS X 10.9のGitでこの問題に遭遇しました。私はそれを次のように解決しました:

git rm -r --cached /path/to/directory

これにより、Gitで削除するディレクトリがステージングされますが、実際には物理ファイルは削除されません(--cached)。これにより、ディレクトリが適切なケースになり、追跡されていないファイルに表示されます。

だからあなたはこれを行うことができます:

mv /path/to/directory /path/to/DIRECTORY
git add -A /path/to/DIRECTORY

その後、Gitはファイルの名前を変更したことを認識します。名前を変更するとgit status、いくつかのrenamed:行が表示されます。それらを検査し、それらが正しいように見えることを確認します。そうであれば、変更を通常どおりコミットできます。


mvコマンドが実際にディレクトリの名前を変更するように機能しないことがわかりました。Finderで名前を変更する必要がありました。それ以外は、この修正は完全に機能します。
Adam S 14

9

これは迅速でバグのないソリューションです。

git mv -f path/to/foo/* path/to/FOO/

警告!名前を変更したフォルダ内のすべてのファイルの名前を常に変更します(を使用/*)。

単一のファイルの名前を変更しないでください。これは、この回答で説明されているバグにつながります

最初に結果を確認したい場合は、次を使用します-n

git mv -f -n path/to/foo/* path/to/FOO/

あなたが作った後mv

  1. 変更をコミットする
  2. 他のリビジョンへのチェックアウト
  3. チェックアウトしてください。

これでGitは、内部ファイルとファイルシステムの両方でフォルダーの名前を変更するはずです。


上記の質問コメントで述べたように、これはGit 2.0.1専用ですか?(stackoverflow.com/a/24979063/6309を参照)
VonC 2015年

8

-fオプションで強制的に実行します。

git mv -f FOO foo

私のために働かない。私の設定は.git / configの「ignorecase = true」です。この方法では、ステージング領域で名前を変更することはできません。(Gitバージョン1.8.3.msysgit.0)Adam Dymitrukのソリューションが唯一の正しい答えです。
Johnny Wong、

あなたの設定を変更@JohnnyWong false、それは私のために働いた
インダー・クマールRathore

他のすべてのユーザーのコンピューターが大文字小文字を無視するように設定されている場合でも、プルすると更新されますか?
ブライス2016

@ブライスいいえ、他のユーザーが変更をプルする前に、変更をコミットして中央リポジトリにプッシュする必要があります。
コンヤック16

3

関連する問題が1つありました。

「Pro」(最初に作成された)という名前のフォルダと、別の「pro」(誤って作成された)という名前のフォルダ。Macでも同じですが、gitによって異なります。

$ git config core.ignorecase false

git configは、ファイルの名前を正しいフォルダーに変更します(ありがとう)。また、「プロ」でゴーストファイルを作成しました(いいえ!!)。ゴーストファイルの変更をトラックに追加できず、それらのファイルを一緒に運ばなければ他のブランチをチェックアウトできず、どういうわけかそれをリセットできませんでした。

その代わりに、私はやった

$ git rm -r --cached pro
$ git status // => pro files removed, new Pro files untracked
$ git add Pro

安全性を高めるために、別の修正ブランチでそれを行い、その後メインブランチにマージしました

によって作成されたゴーストファイルの問題について、どのような方法で、なぜ理由を説明できるか?前もって感謝します。


2

明示的に選択しない限り、OS Xでは大文字と小文字を区別するファイルシステムを使用していません。HFS +はできる大文字と小文字を区別することが、デフォルトでは大文字と小文字を区別しません。


4
OS Xで大文字と小文字を区別するファイルシステムを使用することはお勧めできません。多くのアプリが正しく動作しません。これを試すことから学びました。特別な問題の1つは、Adobe Photoshopが大文字と小文字を区別するファイルシステムがサポートされていないとインストールを拒否することです。
jpswain

1

このページのすべてのgitfooに関する本当にシンプルなソリューションを次に示します。

  1. プロジェクトからファイルを手動でコピーします。
  2. git rmすべてのファイル。
  3. 通常のようにgit commit。
  4. ファイルを手動で追加して戻します。
  5. gitはすべてのファイルを追加します。
  6. 通常のようにgit commit。
  7. 利益。

1
これはローカルで機能しますが、他の誰かがプルを実行しても、ケースは変わりません。
Jason

さまざまなケースでgitの二重エントリを修正する手助けをしてくれてありがとう。私はこれの変種を使用しました。親フォルダの名前を変更しただけです。コミットしました。次に、親フォルダの名前を元に戻しました。そして、2回目のコミットをしました。これで、大文字と小文字が異なる古いエントリはなくなりました。
dreamerkumar 2017

0

「git mv」を使用すると、Adam Dymitrukの回答が改善され(愚かなため、SOが彼の回答にコメントを付けることはできません)、自動的に移動されたファイルを正確にステージングします。隠しておく必要はなく、危険な「git add -A」を回避できます。

old="abc";    new="ABC";
tmp="$old-renamed";
git mv "$old" "$tmp";
git commit -m "Renamed '$old' to '$tmp'.";
git mv "$tmp" "$new";
git commit --amend -m "Renamed '$old' to '$new'.";

0

これは、Windowsでうまく機能しました。以下でPowerShellを使用しました:

  1. mv .\Folder-With-Wrong-Casing .\temp
  2. git add -A
  3. git commit -m "renamed folder with wrong casing to temp"
  4. mv .\temp .\Folder-with-Correct-Casing
  5. git add -A
  6. git commit --amend -m "Renamed to proper casing"
  7. (オプション) git push

上記のアダムの答えに感謝します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.