46

入力するとgit status、次のように表示されます。

# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   DIR/a
#

ただし、作業ディレクトリでは、このファイルが実際に呼び出されていることがわかります(ではなくdir/a小文字に注意してください)。dirDIR

質問:この変更されたファイルをステージング領域に追加してコミットしたいのですが、gitがそれをと見なす方法とは対照的にa、作業ディレクトリ(を示していますdir/a)にあるままにしておきたいです。これどうやってするの?DIR/a

重要な注意点:

残念ながら、実際には作業ツリーに存在しないgit mv DIR/a dir/aため、単純に存在することはできません。DIR/a

現在、私の.git/configファイルにはが表示ingorecase = trueされているので、これをfalseに設定する必要があることはわかっています。ただし、このフラグを変更する以外に何もしなかった後、git statusこれにより次のことが明らかになります。

# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   DIR/a
#
 # Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   dir/

gitはコンテンツのみを追跡し、ignorecaseを切り替えると、gitは新しいファイルが追加されたと見なすため、これを予期していました。残念ながら、gitは、実際には1つしかないのに、変更されたファイルが2つあると考えています。最近作成したものと同じ差分を使用して、の代わりに(作業ディレクトリにあるように)git status単純に表示したいと思います。dir/aDIR/aa

追記

そもそもこのような不安定な状況がどのように発生したのか知りたい場合は、ディレクトリのケースの名前を最初にからに変更したときに犯したばかげた間違いを再現することができましDIRdir。これがこの問題の解決に役立つと思われる場合は、誤ってgitを混乱させた方法を明らかにする編集を行っていただければ幸いです。mv(これには、の代わりに誤ってヒットし、フラグgit mvに気づかずにそのままにしておくことが含まれます)。ignorecaseignorecase=true

4

3 に答える 3

101

例: Mydir を小文字にする場合

git mv src/Mydir src/mydirs

git mv src/mydirs src/mydir

git commit -m "Rename folder Mydir to mydir"
于 2015-06-04T21:52:11.390 に答える
21

回避策を見つけました。もっとエレガントな解決策があるかどうかはわかりませんが、これをテストしたところ、うまくいきました。git はファイルが 1 つしか存在しない場合でも 2 つのファイルが存在すると見なし続けるため、実際にはディレクトリを完全にコピーし、git がファイルとして追跡しているものを削除してから、コピーしたディレクトリを元のディレクトリに戻す必要がありました。

(1) コミットするdir必要があるファイルをすべてコミットします。

(2)cp -r dir tempDir

(3)git add tempDir/

(4)git rm -r dir Dir

(5)git commit -m "Temporary rename of dir to tempDir"

(6)git mv tempDir mms

(7)git commit -m "Full rename from DIR to dir complete"

于 2012-11-05T22:42:42.403 に答える