У меня недавно "Сброс" установки 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 создает их только для чтения?