...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

Gitリポジトリにrmできないファイルがあって困った(解決)

Gitのリポジトリにrmできないファイルが登録されています。

ファイル名の日本語が文字化けしたまま登録されているようです。

5602▒▒▒▒101022_unsorted.csv

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git ls-tree HEAD
100644 blob 25b7b9224949fcd83c1481544dc99dff11d588a0    5602▒▒▒▒101022_unsorted.csv
100644 blob 8f488375ff1b2a635ca9b9cae6c2960fae802d24    5605log.csv
100644 blob c698d1f2ddd89c98d7bdc3477f08e2d2537a5ee4    5606.csv
100644 blob 99ba79c5a780215f6116e2555b9697b750dab152    build.bat
100644 blob c96fc9a3e1a6413befccbd0f00e671745ba6d489    ddbg.exe
100644 blob 3d7a94bbfeea0a85c0a317456aec2369b5f2afb2    ddbg_gdb.bat
100644 blob 9f9882425bfbab1776b7ea5ae918ddaa70300a52    full5605log.csv
100644 blob 49f6adde9c069db5ece2897e95ef2a97e43372d0    go.bat
100644 blob 9055d7a385e4c894ad5bab57168e33145f443ea2    main.d
100644 blob 61db5a9781b1e3822c9536b41b22f2fab03ad345    main.exe.manifest
100644 blob f743a04e64275dc7905cef7abe6359573d2bea51    main_debug.def
100644 blob a3a61fe6f9d525d710f1af512bdbe794d32d2bee    main_release.def
100644 blob 2ee670abb92837809162198e6570c4f4e9ce1410    release.bat
100644 blob edee8482c4ae789cd755d0645b4ac732d397ab25    run.bat
100644 blob 9d35dfe2bef5df0103381aeb6f8eba61c06293cb    shell.bat
100644 blob aa909e5af286121a1f740d8338b4d33f890aa7ca    typetuple2.d

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git show 25b7b9224949fcd83c1481544dc99dff11d588a0
<93><FA><8E><9E>,<D3><C6><C0><8E><ED><95><CA>,F1 F2 F3 F4 F5 F6,F7 F8 F9 FA FB FC,TG(<91><AC><93>x),TG(<8B><97><97><A3>),<8E><ED><95><CA>,<BD>ð<C0><BD>1,<BD>ð<C0><BD>2,<8E>ԑ<AC>,<8E><F3><90>M<DA><CD>
<DE><D9>
 10/10/22 20:17:22,A0h,C9 0A 00 00 00 02,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:22,12h,CA 0A 00 00 00 02,48 B6 00 00 00 00,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:22,A1h,09 1A 00 00 18 12,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:23,A0h,C9 0E 00 00 00 12,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:23,A1h,09 1A 00 00 18 92,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:23,12h,CA 0E 00 00 00 12,D9 8B 00 00 00 00,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:23,FFh,0A 00 4F 00 00 03,1E 5C 13 01 00 00,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:24,A0h,C5 06 02 10 38 12,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:24,A1h,09 19 00 00 18 92,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:24,12h,C6 06 02 10 38 12,8C 24 00 00 00 00,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:26,A1h,09 19 00 00 28 92,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:29,A0h,C5 06 02 10 38 12,00 00 00 00 41 12,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:29,A1h,09 19 00 00 28 92,00 00 00 00 41 12,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:30,FFh,0A 00 4F 00 00 13,1E 5C 10 01 00 00,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:30,A0h,C5 04 02 10 38 12,00 00 00 00 41 12,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:30,12h,C6 04 02 10 38 12,04 32 00 00 00 00,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:32,  ,  ,  ,0000h,0000h,23h,ABh,00h
 10/10/22 20:17:32,FFh,0A 00 4F 00 00 10,1E 54 10 01 00 00,0000h,0000h,21h,ABh,00h
 10/10/22 20:19:18,  ,  ,  ,0000h,0000h,23h,A3h,00h
 10/10/22 20:19:18,FFh,0A 00 4F 00 00 10,1E 5C 10 01 00 00,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:20,A0h,C5 05 02 10 38 12,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:20,A1h,05 14 71 00 28 82,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:20,12h,C6 05 02 10 38 12,40 39 00 00 00 00,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:20,A1h,05 14 71 00 28 A2,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:20,A0h,C5 06 02 10 38 12,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:20,A1h,09 19 00 00 28 A2,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:20,12h,C6 06 02 10 38 12,8C 24 00 00 00 00,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:20,A1h,09 19 00 00 28 92,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:22,FFh,0A 00 4F 00 00 10,1E 5C 13 01 00 00,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:22,A0h,C9 0A 00 00 00 92,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:22,12h,CA 0A 00 00 00 92,C1 22 00 00 00 00,0000h,0000h,21h,A3h,00h

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git rm 25b7b9224949fcd83c1481544dc99dff11d588a0
fatal: pathspec '25b7b9224949fcd83c1481544dc99dff11d588a0' did not match any files

sha-1でファイルを指定する方法は分かりましたが、showはできるのにrmはできません。そういうもの?

 

$ git config --global core.quotepath false

これは設定しているので、git statusしたら化けているファイル1つ以外は、日本語が化けないで表示されます。

・git rm $(git ls-files --deleted) もダメ

Git rmメモ(Hishidama's Git rm Memo)

「git rm」に拠らずに削除されたファイル(UNIXrmコマンドや、エディターの削除機能等で削除したファイル)は、ファイル名の補完が効かないので、指定するのが面倒。

削除されたファイル一覧は「git status」で表示されるので、それをコピーして「git rm」の引数に指定し直せばいいのだが、数が多いと面倒。

「git ls-files --delete」あるいは「git ls-files -d」を使うと(git管理下から)削除されたファイル一覧を表示することが出来るので、それを「git rm」の引数に指定すれば楽。

$ git rm $(git ls-files --deleted)

参考: あっきぃさんの『削除したファイルをコミットする Git

やってみる。

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git ls-files
5602▒▒▒▒101022_unsorted.csv
5605log.csv
5606.csv
build.bat
ddbg.exe
ddbg_gdb.bat
full5605log.csv
go.bat
main.d
main.exe.manifest
main_debug.def
main_release.def
release.bat
run.bat
shell.bat
typetuple2.d

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git ls-files --deleted
5602▒▒▒▒101022_unsorted.csv

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git rm $(git ls-files --deleted)
fatal: pathspec '5602Ô101022_unsorted.csv' did not match any files

ダメだった。

・git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached もダメ

git rm | Atlassian Git Tutorial

ファイルシステムに存在しないファイルを削除する方法
「rm ではなく git rm を使う理由」で説明したとおり、git rm は標準シェル rm と git add を結合して作業ディレクトリからファイルを削除し、削除結果をステージング インデックスにプロモートするのに便利なコマンドです。標準のシェル rm コマンドだけを使って複数のファイルを削除すると、リポジトリの中が散らかってしまいます。

次のコミットの一環として明示的に削除したすべてのファイルを記録する場合は、次のコミットの準備として git commit -a を実行してすべての削除イベントをステージング インデックスに追加します。

ただし、シェル rm で削除したファイルを完全に削除する場合は、以下のコマンドを使用します。

git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
このコマンドでは作業ディレクトリから削除したファイルのリストを生成し、そのリストを git rm --cached にパイプしてステージング インデックスを更新します。

やってみた。

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
fatal: pathspec '5602Ô101022_unsorted.csv' did not match any files

ダメだった。

・git reset --hard でおかしくなった

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git reset --hard
HEAD is now at e6352be Update to dmd 2.101.0

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        deleted:    5602▒▒▒▒101022_unsorted.csv

Untracked files:
  (use "git add <file>..." to include in what will be committed)

...

        56028d868eÔ101022_unsorted.csv

...

        main.exe
        main.obj
        sort/
        svn_ver/

no changes added to commit (use "git add" and/or "git commit -a")

56028d868eÔ101022_unsorted.csv というファイルが復活してきました。

TortoiseGitでは、それとは別に、まだ文字化けしているファイルが行方不明だと言われていますが・・・。

TortoiseGitで「56028d868eÔ101022_unsorted.csv」を「追加」すると、文字化けしたファイルが行方不明だとは表示されなくなりました。

そのままコミットしてみると、TortoiseGit上では行方不明のファイルはなくなりましたが、git bashでgit statusすると、やっぱり文字化けした方がdeletedって出ます。

なんだかややこしいことになりました。

$ git ls-tree HEAD
100644 blob 25b7b9224949fcd83c1481544dc99dff11d588a0    56028d868eÔ101022_unsorted.csv
100644 blob 25b7b9224949fcd83c1481544dc99dff11d588a0    5602▒▒▒▒101022_unsorted.csv

ハッシュ値が同じだけど、それっていいのだろうか。ファイルの内容だけで決まる?

brobはファイルの内容だけで、indexはファイルパスと内容で決まるそうです。

じゃあ、indexを編集すればいいかも。

・rm .git/index

Gitリポジトリのインデックスが壊れたら - Eyes, JAPAN Blog

$ rm .git/index
$ git reset

エクスプローラーで.git/indexを削除してみます。

削除した後に、まずは git status で状態を見てみます。

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    5602▒▒▒▒101022_unsorted.csv
        deleted:    5605log.csv
        deleted:    5606.csv
        deleted:    build.bat
        deleted:    ddbg.exe
        deleted:    ddbg_gdb.bat
        deleted:    full5605log.csv
        deleted:    go.bat
        deleted:    main.d
        deleted:    main.exe.manifest
        deleted:    main_debug.def
        deleted:    main_release.def
        deleted:    release.bat
        deleted:    run.bat
        deleted:    shell.bat
        deleted:    typetuple2.d

...

TortoiseGitでは、文字化けしたファイルが行方不明でなく削除と認識されました。

このままだと、必要なファイルまでdeletedになってしまうので、これは差分として認めません。

文字化けしたファイル以外について、TortoiseGitで「変更の取り消し」をします。

それから、コミット。成功しました。

git bashで見てみると、

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

...

ちゃんと削除できているようです。

やったね!