web-dev-qa-db-ja.com

git mvおよびディレクトリの大文字と小文字のみを変更します

私は同様の question を見つけましたが、私の問題に対する答えは見つかりませんでした

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)を使用していると思ったのは、単にディレクトリの名前を変更できないのですか?

247
oschrenk

大文字と小文字を区別しない環境にいます。さらに、-Aを追加せずに追加すると、Gitが理解しているように、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つで示唆されているように、対話型リベース(間違ったケースが5コミット前に導入された場合はgit rebase -i HEAD~5)を実行して、そこでケースを修正し、履歴のどこにも間違ったケースが表示されないようにすることもできます。それ以降のコミットハッシュは異なるため、他の人は自分の作業をブランチの最近の過去とリベースまたは再マージする必要があるため、これを行う場合は注意する必要があります。

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

383
Adam Dymitruk

オプションcore.ignorecaseをfalseに設定すると、Gitがネイティブにサポートしていないファイルシステムの大文字小文字に注意を払うことになります。リポジトリで有効にするには:

$ git config core.ignorecase false

その後、git mvを使用してファイルの名前を変更すると、期待どおりに機能します。

139
mipadi

一時ファイル名を使用してgit 1.7.7を使用すると、これを解決できました。

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

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:行が多数表示されるはずです。それらを検査し、正しく見えることを確認します。そうであれば、通常どおり変更をコミットできます。

13
wizonesolutions

-fオプションを使用して強制的に実行します。

git mv -f FOO foo
8
konyak

これは、迅速でバグセーフなソリューションです。

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

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

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

最初に結果を確認する場合は、-nを使用します。

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

mvを作成した後:

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

これで、Gitは内部ファイルとファイルシステムの両方のフォルダーの名前を変更する必要がありました。

8
Nick Volynkin

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

2
Nicholas Knight

関連する問題が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
Liang

このページのすべてのgitfooを取り巻く非常にシンプルなソリューションです。

  1. プロジェクトからファイルを手動でコピーします。
  2. git rmすべてのファイル。
  3. 通常のgitコミット。
  4. 手動でファイルを追加し直してください。
  5. gitはすべてのファイルを追加します。
  6. 通常のgitコミット。
  7. 利益。
1
Askdesigners

Adam Dymitrukの回答を改善する(SOが私に彼の回答をコメントさせないのは愚かなことです)、「git mv」を使用すると、移動したファイルが自動的に正確にステージングされます。スタッシングは不要で、危険な「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
Rainer Blome