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」に拠らずに削除されたファイル(UNIXのrmコマンドや、エディターの削除機能等で削除したファイル)は、ファイル名の補完が効かないので、指定するのが面倒。
削除されたファイル一覧は「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.csvUntracked 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はファイルパスと内容で決まるそうです。
gitって、blob = ファイルの中身(だけ), index = ファイルパス + blob なので、blob のハッシュだけ知っていても使えなさそうですね。
— いーがりー@Kotlin/Android フリーランス (@irgaly) 2022年11月25日
index からファイル名を取り除く必要がある。
個人リポジトリならもう他のディレクトリにcloneしなおして作業するとかでいいかも...https://t.co/z7CtJtP44c
じゃあ、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)
...
ちゃんと削除できているようです。
やったね!