#bash #git #delete-file #fuse #rm
#bash #git #удалить-файл #предохранитель #rm
Вопрос:
Невозможно удалить .git
У меня есть репозиторий git, Rift
, который я пытаюсь удалить. При попытке запуска rm -rf
я получаю сообщение об ошибке: rm: cannot remove 'Rift/.git/objects/pack': Directory not empty
.
Когда я перехожу к нижней части дерева каталогов, я нахожу скрытый файл, .fuse_hidden
за которым следует строка цифр и букв, возможно, шестнадцатеричная. Я могу вручную удалить этот файл, но как только я его удалю, на его месте будет создан другой файл с другой строкой цифр и букв, добавленных к нему.
Я пробовал rm .git/objects/pack/* amp;amp; rm -rf .git
, sudo rm -rf .git
, chmod -w .git/objects/path
и killall git
, ни один из которых не имел никакого успеха.
Комментарии:
1. Я предполагаю, что у вас может быть процесс, отличный от git, который обращается к этому репозиторию git. Попробуйте выяснить, что создает эти файлы, и уничтожить или временно отключить этот процесс.
2. @ewong Это то, что я пытаюсь сделать, но я не знаю простого способа сделать это … или вообще каким-либо способом.
3. FUSE — это структура файловой системы пользовательского пространства . Это означает, что в вашем репозитории Git есть точка монтирования внутри него. Вам нужно отменить монтирование.
4. FUSE — это фреймворк, но в Linux вам не нужно монтировать устройство как файловую систему.
mount
Команда покажет существующие подключения. (Может быть, ваш репозиторий находится под монтированием предохранителя, а не содержит его? Возможно, файловая система пользовательского пространства, о которой идет речь, тоже ведет себя неправильно.)5. @DeathWaltz: Что произойдет, если вы переименуете
.git
. Все еще новые файлы таинственным образом появляются там сами по себе?
Ответ №1:
Вы можете использовать fuser
команду.
fuser
Это утилита командной строки, предназначенная для определения местоположения процессов на основе файлов, каталогов или сокета, к которым обращается конкретный процесс. Это помогает системному пользователю идентифицировать процессы, использующие файлы или сокеты.
Используйте fuser
команду в .git
каталоге, чтобы найти все идентификаторы процессов, которые обращаются к каталогу.
fuser .git
После этого вы можете использовать -k
параметр для завершения процессов, и тогда вы сможете удалить каталог.
fuser -k .git
Комментарии:
1. Вы имеете в виду
fuser --kill <filename>
?2. Вы могли бы сделать, или вы можете сначала исследовать, используя параметр verbose -v, а затем решить.
3. Цель stack overflow заключается не только в том, чтобы помочь пользователям с их текущим вопросом, но и будущим пользователям с тем же вопросом. Итак, если бы вы могли предоставить эту деталь в своем ответе, это помогло бы не только мне, но и будущим поколениям с подобными проблемами.
4. Похоже, это исправило проблему, но не совсем точно. Если проблема не устранена и это не сработает, я вернусь.
5. Закрытие терминала сработало для меня. Это убило процесс, который продолжал записывать
fuse_hidden
файлы, и я смогrm -rf .git
.
Ответ №2:
Другое решение, которое я недавно нашел, — использовать lsof
команду, используя поврежденное имя файла в качестве параметра. Например:
#This will give you information about what process has the file open
[root@host]$ lsof .git/objects/pack/.fuse_hidden000000000f1f
#This will kill the process locking the file
[root@host]$ kill -s 9 $(lsof -t .git/objects/pack/.fuse_hidden000000000f1f)
-t
Коммутатор сообщает lsof использовать «краткий» режим, возвращая только PID.
Затем этот PID передается с kill
использованием -s 9
флага, что означает отправку сигнала «SIGKILL» вместо более вежливого запроса по умолчанию «SIGTERM» или, возможно, «SIGHUP»