3

У меня недавно "Сброс" установки Windows 10. Я установил дистрибутив Git "Git для Windows" со страницы https://git-scm.org/.

Если я создаю git-репозиторий любым способом (будь то init или clone), этот репозиторий нельзя удалить из моей файловой системы с помощью командной строки. Я должен использовать Windows Explorer, чтобы сделать это.

Вот пример сеанса:

PS C:\Users\radix> mkdir foo


    Directory: C:\Users\radix


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        5/10/2018   5:46 PM                foo


PS C:\Users\radix> cd foo
PS C:\Users\radix\foo> git init .
Initialized empty Git repository in C:/Users/radix/foo/.git/
PS C:\Users\radix\foo> cd ..
PS C:\Users\radix> rm foo -Recurse
rm : Cannot remove item C:\Users\radix\foo\.git: You do not have sufficient access rights to perform this operation.
At line:1 char:1
+ rm foo -Recurse
+ ~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (.git:DirectoryInfo) [Remove-Item], IOException
    + FullyQualifiedErrorId : RemoveFileSystemItemUnAuthorizedAccess,Microsoft.PowerShell.Commands.RemoveItemCommand
rm : Directory C:\Users\radix\foo cannot be removed because it is not empty.
At line:1 char:1
+ rm foo -Recurse
+ ~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (C:\Users\radix\foo:DirectoryInfo) [Remove-Item], IOException
    + FullyQualifiedErrorId : DirectoryNotEmpty,Microsoft.PowerShell.Commands.RemoveItemCommand

Это PowerShell, работающий как мой обычный пользователь. Даже если я запускаю Powershell от имени администратора, команда rm -Recurse прежнему не выполняется точно так же. Единственный известный мне способ удаления этого нового каталога foo - это сделать это через проводник Windows, который даже не жалуется и не запрашивает разрешения - он просто удаляет его без проблем.

Я не верю, что это проблема PowerShell, потому что подобное поведение происходит в CMD:

C:\Users\radix>dir foo
 Volume in drive C is Blade
 Volume Serial Number is B83C-EF1B

 Directory of C:\Users\radix

File Not Found

C:\Users\radix>git init foo
Initialized empty Git repository in C:/Users/radix/foo/.git/

C:\Users\radix>del foo
C:\Users\radix\foo\*, Are you sure (Y/N)? y

C:\Users\radix>dir foo
 Volume in drive C is Blade
 Volume Serial Number is B83C-EF1B

 Directory of C:\Users\radix\foo

05/17/2018  08:46 PM    <DIR>          .
05/17/2018  08:46 PM    <DIR>          ..
               0 File(s)              0 bytes
               2 Dir(s)  275,911,991,296 bytes free

C:\Users\radix>dir /a foo
 Volume in drive C is Blade
 Volume Serial Number is B83C-EF1B

 Directory of C:\Users\radix\foo

05/17/2018  08:46 PM    <DIR>          .
05/17/2018  08:46 PM    <DIR>          ..
05/17/2018  08:46 PM    <DIR>          .git
               0 File(s)              0 bytes
               3 Dir(s)  275,866,763,264 bytes free

Команда DEL не отображает никаких ошибок, но не может фактически удалить репозиторий.

Важно отметить, что команда rm действительно удаляет файлы из репозитория, включая файлы в каталоге .git . Но он оставляет каталог .git там.

Было установлено, что "скрытый" характер подкаталога .git вызывает проблему. Вот расшифровка моих экспериментов по этому поводу:

PS C:\Users\radix> git init foo
Initialized empty Git repository in C:/Users/radix/foo/.git/

На этом этапе я открываю Windows Explorer и перехожу в каталог C:/Users/radix/foo и переименовываю .git в git . Я также щелкаю правой кнопкой мыши по каталогу .git и открываю диалоговое окно "Свойства", отмечая, что у него нет "скрытого" флага. Я также захожу в каталог git и щелкаю правой кнопкой мыши по свойствам в нескольких подкаталогах и файлах, отмечая, что ни в одном из них не установлен флаг "Скрытый".

И тогда я пытаюсь удалить каталог из powershell:

PS C:\Users\radix> del foo

Confirm
The item at C:\Users\radix\foo has children and the Recurse parameter was not specified. If you continue, all children
will be removed with the item. Are you sure you want to continue?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): a
del : Cannot remove item C:\Users\radix\foo\git: You do not have sufficient access rights to perform this operation.
At line:1 char:1
+ del foo
+ ~~~~~~~
    + CategoryInfo          : PermissionDenied: (git:DirectoryInfo) [Remove-Item], IOException
    + FullyQualifiedErrorId : RemoveFileSystemItemUnAuthorizedAccess,Microsoft.PowerShell.Commands.RemoveItemCommand
del : Directory C:\Users\radix\foo cannot be removed because it is not empty.
At line:1 char:1
+ del foo
+ ~~~~~~~
    + CategoryInfo          : WriteError: (C:\Users\radix\foo:DirectoryInfo) [Remove-Item], IOException
    + FullyQualifiedErrorId : DirectoryNotEmpty,Microsoft.PowerShell.Commands.RemoveItemCommand

Я заметил, что некоторые из папок в этой иерархии помечены как «Только для чтения». Это связано?

Поэтому у меня есть два вопроса: почему я не могу удалить эту папку и почему git создает ее так, что ее нельзя удалить в первую очередь? Если проблема в том, что каталоги доступны только для чтения, почему git создает их только для чтения?

1 ответ1

5

Начну с более простого случая: del in cmd никогда не будет делать то, что вы хотите, потому что он только удаляет файлы. Даже в этом случае без /s он не будет повторяться и будет удалять только файлы в каталоге верхнего уровня.

Итак, для cmd вы должны использовать rmdir /s для рекурсивного удаления всех файлов и папок. Добавьте /q если вы хотите отключить запрос подтверждения.


Теперь PowerShell. Remove-Item (это то, к чему относится rm и del alias) с просто -Recurse не будет возвращаться в скрытые каталоги и, следовательно, не будет удалять их содержимое. Что приводит к вашей ошибке - это не "отказано в разрешении", а "каталог не пустой".

Чтобы обойти это, вы можете передать параметр -Force (эквивалентный * nix -f). Так что rm -r -force или Remove-Item -Recurse -Force должны работать.

Я не совсем уверен, как вы получаете не скрытый каталог .git - GfW (предположительно более старый 2.9.2) создает их как скрытые для меня. В cmd запустите attrib .git чтобы проверить, не скрыт ли он. Если скрытый Remove-Item -Recurse не скрыт, он работает без -Force .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .