У меня недавно была «Сброс» установки 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 и перехожу в 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 создает их только для чтения?
.git
каталог скрыт и Remove-Item
отказывается от его удаления, если не указан -Force
параметр.
C:\User\user_name
? Также попробуйте с помощью git в cygwin (т.е. установите cygwin, откройте установку cygwin, установите git).