Gitで大文字と小文字を区別するファイル名のみの変更をコミットするにはどうすればよいですか?


1302

のように、最初の文字を大文字にしないことで、いくつかのファイル名を変更しましName.jpgname.jpg。Gitはこの変更を認識しないため、ファイルを削除して再度アップロードする必要がありました。ファイル名の変更をチェックするときにGitが大文字と小文字を区別する方法はありますか?ファイル自体は変更していません。


4
@nこれがまったく正しくない場合、Gitには実際に大文字と小文字の区別を無視するかどうかを制御する構成設定があります。


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


この投稿を参照してください。コミットはできましたが、パラメータとしてファイルパスを指定せずにgit commit -m "msg"を使用しました。インデックスを更新し、ファイルをチェックインしました。[リンク] stackoverflow.com/questions/35790113/...
ARKS

回答:


1517

git mvを使用できます。

git mv -f OldFileNameCase newfilenamecase

12
これにより、「ソースディレクトリは空です」ではありませんが、そうではありません
WiseStrawberry '19

6
ここでMacOS(大文字と小文字を区別しないFS)を使用して-fが機能しました!ヒントをありがとう
caesarsol 2016

49
最近のバージョンでは、-fフラグは不要になりました。
Joshua Pinter 2017

8
完全なファイルパスを指定することを忘れないでください。
当然

7
投票数の多いコメントに:最新のgit(2.18)のスイッチ必要-fですfatal: destination exists。そうでない場合、エラーが発生する可能性があります。
DeepSpace101

1038

Gitには、大文字と小文字を区別するかどうかを指示する構成設定がありますcore.ignorecase。Gitで大文字と小文字を区別するには、この設定をfalse次のように設定します。

git config core.ignorecase false

ドキュメンテーション

git configドキュメントから:

core.ignorecase

trueの場合、このオプションはさまざまな回避策を有効にし、FATなどの大文字と小文字を区別しないファイルシステムでgitが適切に機能するようにします。たとえば、gitがをmakefile期待しているときにディレクトリリストが見つかった場合Makefile、gitはそれが実際に同じファイルであると想定し、それを次のように記憶し続けますMakefile

デフォルトはfalseです。ただし、git-clone(1)またはgit-init(1)core.ignorecase、リポジトリの作成時に必要に応じてプローブし、true を設定します。

大文字と小文字を区別しないファイルシステム

私が知っている、大文字と小文字を区別しないファイルシステムを持つ最も人気のある2つのオペレーティングシステムは、

  • ウィンドウズ
  • OS X

9
余談ですが、Mac OS X自体は大文字と小文字を区別しないとは思いません。代わりに、大文字と小文字を区別するのはファイルシステムです。HFS +パーティションをフォーマットするとき、ユーザーは、大文字と小文字を区別するかどうかを選択できます。大文字と小文字を区別しないがデフォルトです。
spaaarky21 2014

225
この回答でfalseは、大文字と小文字を区別しないファイルシステムでこのオプションをに設定すること悪い考えであることに注意してください。これは必ずしも明白ではありません。たとえば、私のMacでこれを試してみたところ、問題が解決すると考えて、ファイルの名前をからproductPageCtrl.jsに変更しましたProductPageCtrl.jsgit status見た新しいというファイルをProductPageCtrl.jsしかしなかったことを考えるproductPageCtrl.js削除されていました。新しいファイルを追加してコミットし、GitHubにプッシュすると、GitHubリポジトリには両方のファイルが含まれていました(最新のものと思われる)ローカルリポジトリには1つしかありませんでした。
Mark Amery、2015

5
@MarkAmeryこれは、Gitクライアントのバグによく似ています。報告を提出しましたか?
ドミ2015

24
@Domiこれはバグではなく、予想される動作です。これは実際に発生することなので、非依存ファイルシステムでこれをfalseに設定することは実際には悪い考えです。gitが小文字のファイルが削除されたことを確認しなかった理由は、このオプションがfalseに設定されていないgitでは大文字と小文字が無視されるため、ファイルシステムは削除されたと報告しないからです。ファイル名にntfsでの大文字と小文字の違いがないか、太っていないということではなく、ファイル名の検索では大文字と小文字が区別されません。
ohcibi 2016年

15
@Domi git 十分スマートです。そのため、大文字と小文字を区別しないファイルシステムでは、これをfalseに設定しないでください。git mvファイルを移動し、gitがそれを管理する方法を確認するために使用します。gitなしでファイルを移動する場合、ファイルシステムがgitに真実を伝えていないため、gitができることはもありません。これはntfs / fat / hfsなどの問題であり、git / linuxではありません。
ohcibi 2016年

158

SourceTreeを使用して、UIからこれをすべて行うことができました

  1. 名前 FILE.extを変更whatever.ext
  2. ステージそのファイル
  3. 名前 whatever.ext変更してくださいfile.ext
  4. そのファイルを再度ステージングします

少し面倒ですが、いくつかのファイルに対してのみ実行する必要がある場合は、かなり高速です。


5
git bashと同じ
Alex78191 2017年

3
「そのファイルのステージング」は重要な部分です-上記の他の答えはどれも私にとってうまくいきませんでした。それは実際には普通のWindowsコマンドプロンプトで動作しました。
Vlad Sabev 2017

1
これがステージングエリア全体で機能することを知りませんでした。しかし、私の場合、フォルダ名とそれらのフォルダ内のいくつかのファイルを変更したいと思いました。そこで、最初にすべてのフォルダの名前を一時的な名前に変更しました。新しい名前(その中のすべてのファイル)と「削除された」ファイルをコミットしました。Gitはそれらすべてに「名前変更」のフラグを付けました。次に、それらすべてのフォルダーの名前を新しいケースバージョンに戻し、再度コミットしました。最後に、これら2つのコミットをマージしました。しかし、あなたが書いたものに基づいて、私は2つのコミット+マージを作成せずに、直接、サッティングエリアを介してすべてを行うことができました。
ThermoX 2018年

3
フォルダー名のgitkrakenでも動作します。
Philippe Matray

私はこの面倒な作業を行うためにPython 3スクリプトを作成しました:stackoverflow.com/a/58159822/4934640
user

126

これは私がOS Xでやったことです:

git mv File file.tmp
git mv file.tmp file

それ以外の場合は「ファイルが存在します」というエラーが発生したため、2つの手順を実行します。おそらくそれを追加すること--cachedなどにより、1つのステップで行うことができます。


21
一番上の答えが示唆しているように、-f(force)はあなたが探しているフラグです
rperryng

5
@rperryng-いいえ-f、基礎となるFSで大文字と小文字が区別されない場合、フラグは役に立ちません。しかし、2ステップの解決策は私にとって
うまくいき

大文字と小文字を区別しないFS(Macの場合)を使用して動作し-fました!先端をありがとう
caesarsol

これは、-fフラグのないウィンドウのフォルダでも機能しました。
2017年

git -c "core.ignorecase=false" add .コミット用に大文字と小文字が変更されたファイルを考慮します。
nietonfir 2017

67

Gitの大文字と小文字の区別を一時的に変更すると便利な場合があります。

方法#1-単一のコマンドの大文字と小文字の区別を変更します。

git -c core.ignorecase=true checkout mybranch1つのcheckoutコマンドの大文字と小文字の区別をオフにします。またはより一般的に:。(コメントでこれを提案したVonCへのクレジット)git -c core.ignorecase= <<true or false>> <<command>>

方法#2-複数のコマンドの大文字と小文字の区別を変更します。

設定を長く変更するには(たとえば、元に戻す前に複数のコマンドを実行する必要がある場合):

  1. git config core.ignorecase(これにより、現在の設定が返されますfalse)。
  2. git config core.ignorecase <<true or false>> -必要な新しい設定を設定します。
  3. ...他の複数のコマンドを実行します...
  4. git config core.ignorecase <<false or true>> -設定値を以前の設定に戻します。

1
なぜ直接しないのgit -c core.ignorecase=<true or false> checkout <<branch>>ですか?後にリセットするものはありません。
VonC 2018

2
私は小文字から大文字に変更するときに提案されたcore.ignorecaseが機能する奇妙な経験をしましたが、大文字から小文字には変更しませんでした。唯一の信頼できる解決策は、ファイル名の大文字と小文字を認識できないOSの使用を停止することです。
aspiringGuru

一時的な変更が必要な理由はありますか?大文字と小文字を区別するように設定を変更したままにしておくと、問題が発生しますか?
cytsunny

これは、いくつかの要因、特にターゲットファイルシステムで大文字と小文字が区別されるかどうかに依存する場合があります。en.wikipedia.org/ wiki / Case_sensitiveivityIn_filesystemsを参照してください。デプロイメントファイルシステムで、開発に使用されるファイルシステムに対して大文字と小文字が区別される場合は、一時的な変更が必要になることがあります。また、私の場合は、全員が同じGit設定(大文字と小文字を区別する)を期待されているチームで作業しているため、オフにした場合は一時的なものにする必要があります。
Steve Chambers

44

OSXでは、この問題を回避し、大文字と小文字を区別しないファイルシステムでの開発に関するその他の問題を回避するために、ディスクユーティリティを使用して大文字と小文字を区別する仮想ドライブ作成できます。 /ディスクイメージ。

ディスクユーティリティを実行し、新しいディスクイメージを作成し、次の設定を使用します(または必要に応じて変更しますが、大文字と小文字を区別します)。

Macディスクユーティリティのスクリーンショット

gitが大文字と小文字を区別するFS上にあることを確認してください。

git config core.ignorecase false

15
いや、nuclearはOSXで完全に大文字と小文字を区別するブートドライブを実行しています。不十分な(ahem、Adobe)アプリを作成せずに生活するか、独自の愚かなVMで実行する必要がありますが、主に* nixシステム用にコーディングする場合は価値があります。
マイクマルカッチ2015

1
これが正しく機能する唯一のオプションです。私は残りを試しました、そしてあなたは何らかの方法で漬物に終わります。これを行うことで問題を適切に解決します。
John Hunt

2
ディスクユーティリティにはバグOS X 10.11があることに注意してください-大文字と小文字を区別する画像は作成されません。コマンドラインツールhdiutilを使用する必要があります。apple.stackexchange.com/questions/217915/…–デルサラ2017
1

7
ハイシエラのAPFSでは、これはさらに簡単です。プラス記号の付いたドライブのアイコンをクリックし、サイズに制限のない、大文字と小文字を区別するボリュームを追加します。メインボリュームとスペースを共有し、/ Volumes / volume-nameにマウントします。
マイケルフォックス

21

私は他の答えから次の解決策を試しましたが、うまくいきませんでした:

リポジトリがリモートでホストされている場合(GitHub、GitLab、BitBucket)、送信元(GitHub.com)でファイルの名前を変更し、トップダウン方式でファイルの名前を強制的に変更できます。

以下の手順はGitHubに関するものですが、それらの背後にある一般的な考え方は、すべてのリモートリポジトリホスティングプラットフォームに適用する必要があります。名前を変更しようとしているファイルの種類、つまりGitHubがブラウザー内で編集可能(コード、テキストなど)と編集できない(ファイル、バイナリなど)と見なすファイルの種類が重要であることを覚えておいてください。

  1. GitHub.comにアクセス
  2. GitHub.comのリポジトリに移動し、作業中のブランチを選択します
  3. サイトのファイルナビゲーションツールを使用して、名前を変更するファイルに移動します
  4. GitHubでは、ブラウザー内でファイルを編集できますか?
    • a。)編集可能
      1. [このファイルを編集]アイコンをクリックします(鉛筆のように見えます)。
      2. ファイル名のテキスト入力でファイル名を変更する
    • b。)編集不可
      1. 新しいタブで[ダウンロード]ボタンを開き、ファイルをコンピューターに保存します
      2. ダウンロードしたファイルの名前を変更する
      3. GitHub.comの前のタブで、[このファイルを削除]アイコンをクリックします(ゴミ箱のように見えます)。
      4. 「に直接コミットする branchnameブランチに」ラジオボタンが選択され変更をコミット」ボタンをクリックします
      5. GitHub.comの同じディレクトリ内で、[ファイルをアップロード]ボタンをクリックします
      6. 名前を変更したファイルをコンピュータからアップロードします
  5. 「に直接コミットする branchnameブランチに」ラジオボタンが選択され変更をコミット」ボタンをクリックします
  6. ローカルで、ブランチをチェックアウト/フェッチ/プルする
  7. できた

BitBucketで直接名前を変更しましたが、うまくいきました。ありがとう。
rsc

知ってよかった。この手法は、理論的には任意のリポジトリホスティングプラットフォームで機能するはずですが、機能しないものがあるかどうか知りたいです。
gmeben

画像やPDFなど、ブラウザで編集できないファイルには機能しません。もちろん、編集オプションはありません。
Abhijit Sarkar

@AbhijitSarkar良い点。それらのケースの回答を更新しました。私はこれらの指示が機能することをテストして確認しました。
gmeben

誰かがこの方法でディレクトリの名前を変更できますか?
Solvitieg

21

@Sijmenの回答と同様に、これはOSXで私がディレクトリの名前を変更するときに機能したものです(別の投稿からのこの回答に触発されています):

git mv CSS CSS2
git mv CSS2 css

単に行うとgit mv CSS css、無効な引数エラーが発生しました。fatal: renaming '/static/CSS' failed: Invalid argumentおそらくOSXのファイルシステムが大文字と小文字が区別されないためです

ps BTW Djangoを使用している場合、collectstaticも大文字と小文字の違いを認識せず、静的ルートディレクトリでも手動で上記を実行する必要があります。


19

1)ファイルの名前Name.jpgname1.jpg

2)削除されたファイルをコミットする Name.jpg

3)ファイルの名前name1.jpgname.jpg

4)name.jpg前のコミットに追加されたファイルを修正する

git add
git commit --amend

2
これfatal: bad source, source=name1.jpg, destination=name.jpgはステップ3で取得しています。提案はありますか?Thx
アンソニーコング

1
コミットはできませんgit add
Alex78191 2017年

とてもハックに見えますね。またはモンキーパッチ。
jeromej 2018年

18

私は次の手順を使用しました:

git rm -r --cached .
git add --all .
git commit -a -m "Versioning untracked files"
git push origin master

私にとっては簡単な解決策です


これが解決策です。そして、他の回答とは異なり、バッチの名前変更を行うときにうまく機能します。glamourphilly.orgでは、すべての.Jpgを.jpgに変更する必要がありました。Finderで、あなたはそのようなバッチ名前の変更を行うことができますし、この答えは、あなたはそれをチェックできます。
ウィリアム・エントリケン

11

git mvコマンドを使用できます。以下の例では、ファイル名をabcDEF.jsからabcdef.jsに変更した場合、ターミナルから次のコマンドを実行できます。

git mv -f .\abcDEF.js  .\abcdef.js

8

Mac OSX High Sierra 10.13ではこれが多少修正されています。gitプロジェクト用の仮想APFSパーティションを作成するだけです。デフォルトでは、サイズの制限はなく、スペースも必要ありません。

  1. ディスクユーティリティで、コンテナディスクが選択されているときに+ボタンをクリックします
  2. フォーマットでAPFS(大文字と小文字を区別)を選択します
  3. それに名前を付けます Sensitive
  4. 利益
  5. オプション:Sensitiveでフォルダーを作成しgitln -s /Volumes/Sensitive/git /Users/johndoe/git

ドライブが入ります /Volumes/Sensitive/

ここに画像の説明を入力してください

Gitで大文字と小文字を区別するファイル名のみの変更をコミットするにはどうすればよいですか?


私はこの提案が大好きです。醜い回避策に頼ることなく、エレガントで痛みなく問題を解決します。ありがとう!
Phil Gleghorn 2018

4

MacOSでこの問題に何度か遭遇しました。Gitは大文字と小文字を区別しますが、Macは大文字と小文字を区別するだけです。

誰かがファイルをコミットしFoobar.java、数日後にファイル名を変更することにしましたFooBar.java。最新のコードをプルすると失敗しますThe following untracked working tree files would be overwritten by checkout...

これを修正する私が見た唯一の信頼できる方法は:

  1. git rm Foobar.java
  2. 見逃せないメッセージでコミット git commit -m 'TEMP COMMIT!!'
  3. 引く
  4. これにより、競合がポップアップ表示され、競合をマージする必要があります-変​​更によって削除されましたが、他の変更によって名前が変更されたため(したがって問題)
    1. 「削除」である変更を受け入れます
    2. git rebase --continue
  5. 今すぐあなたの回避策ドロップgit rebase -i HEAD~2dropTEMP COMMIT!!
  6. ファイルが呼び出されていることを確認します FooBar.java

3

多くのファイル名の変更を行い、その一部が大文字と小文字の変更にすぎない場合、どちらがどれであるかを覚えるのは困難です。手動でファイルを「git move」すると、かなりの作業になる可能性があります。したがって、ファイル名変更タスク中に私が行うことは次のとおりです。

  1. git以外のすべてのファイルとフォルダーを別のフォルダー/リポジトリーから削除します。
  2. 現在の空のgitフォルダーをコミットします(すべてのファイルが削除されたときに表示されます)。
  3. すべてのファイルを元のgitフォルダー/リポジトリに追加します。
  4. 現在の空でないgitフォルダーをコミットします。

これにより、名前を変更したファイルまたはフォルダーを特定することなく、すべてのケースの問題が修正されます。


なぜgit commmit --amendパラグラフ4ではないのですか?それ以外の場合は、すべてのファイルを削除して、追加のコミットが行われます。またはgit rebase -iスカッシュと一緒に使用できます。
Alex78191 2017年

1

何もうまくいかない場合は、git rm filenameを使用してファイルをディスクから削除し、再度追加します。


0

私は@CBarrの回答を受け取り、ファイルのリストでそれを行うためのPython 3スクリプトを作成しました。

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import os
import shlex
import subprocess

def run_command(absolute_path, command_name):
    print( "Running", command_name, absolute_path )

    command = shlex.split( command_name )
    command_line_interface = subprocess.Popen( 
          command, stdout=subprocess.PIPE, cwd=absolute_path )

    output = command_line_interface.communicate()[0]
    print( output )

    if command_line_interface.returncode != 0:
        raise RuntimeError( "A process exited with the error '%s'..." % ( 
              command_line_interface.returncode ) )

def main():
    FILENAMES_MAPPING = \
    [
        (r"F:\\SublimeText\\Data", r"README.MD", r"README.md"),
        (r"F:\\SublimeText\\Data\\Packages\\Alignment", r"readme.md", r"README.md"),
        (r"F:\\SublimeText\\Data\\Packages\\AmxxEditor", r"README.MD", r"README.md"),
    ]

    for absolute_path, oldname, newname in FILENAMES_MAPPING:
        run_command( absolute_path, "git mv '%s' '%s1'" % ( oldname, newname ) )
        run_command( absolute_path, "git add '%s1'" % ( newname ) )
        run_command( absolute_path, 
             "git commit -m 'Normalized the \'%s\' with case-sensitive name'" % (
              newname ) )

        run_command( absolute_path, "git mv '%s1' '%s'" % ( newname, newname ) )
        run_command( absolute_path, "git add '%s'" % ( newname ) )
        run_command( absolute_path, "git commit --amend --no-edit" )

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