Не удается удалить .git: каталог не пуст

#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»