Recientemente he "restablecido" la instalación de Windows 10. Instalé la distribución "Git para Windows" de Git desde https://git-scm.org/ .
Si creo un repositorio git de alguna manera (ya sea init
o no clone
), ese repositorio no se puede eliminar de mi sistema de archivos con un indicador de línea de comandos. Tengo que usar el Explorador de Windows para hacerlo.
Aquí hay una sesión de muestra:
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
Este es PowerShell ejecutándose como mi usuario normal. Incluso si ejecuto Powershell como administrador, el rm -Recurse
comando todavía falla exactamente de la misma manera. La única forma en que sé eliminar este nuevo foo
directorio es hacerlo a través del Explorador de Windows, que ni siquiera se queja ni solicita permisos, simplemente lo elimina silenciosamente sin ningún problema.
No creo que este sea un problema específico de PowerShell, porque ocurre un comportamiento similar en 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
El comando DEL no muestra ningún error, pero no puede eliminar realmente el repositorio.
Es importante tener en cuenta que el rm
comando elimina los archivos del repositorio, incluidos los archivos dentro del .git
directorio. Pero deja el .git
directorio allí.
Se ha postulado que la naturaleza "oculta" del .git
subdirectorio está causando un problema. Aquí hay una transcripción de mi experimentación con respecto a eso:
PS C:\Users\radix> git init foo
Initialized empty Git repository in C:/Users/radix/foo/.git/
En este punto, abro el Explorador de Windows y navego al C:/Users/radix/foo
directorio, y cambio el nombre .git
a git
. También hago clic derecho en el .git
directorio y abro el cuadro de diálogo Propiedades, notando que no tiene la bandera "oculta". También navego en el git
directorio y hago clic con el botón derecho en abrir-propiedades en varios subdirectorios y archivos, notando que ninguno de ellos tiene el conjunto de banderas "Oculto".
Y luego trato de eliminar el directorio de 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
Me doy cuenta de que varias de las carpetas de esta jerarquía están marcadas como "Solo lectura". ¿Eso está relacionado?
Entonces tengo dos preguntas: ¿por qué no puedo eliminar esta carpeta y por qué git la crea de una manera que no se puede eliminar en primer lugar? Si el problema es que los directorios son de solo lectura, ¿por qué git los crea como de solo lectura?
fuente
.git
directorio está oculto y seRemove-Item
niega a eliminarlo, a menos que especifique el-Force
parámetro.C:\User\user_name
? Pruebe también con git en cygwin (es decir, instale cygwin, abra la configuración de cygwin, instale git).Respuestas:
Comenzaré abordando el caso más fácil:
del
en cmd nunca hará lo que desea, porque solo elimina archivos . Incluso entonces, sin/s
ella no se repetirá y solo eliminará archivos en el directorio de nivel superior.Entonces, para cmd, debe usar
rmdir /s
para eliminar recursivamente todos los archivos y carpetas. Agregue/q
si desea deshabilitar la solicitud de confirmación.Ahora, PowerShell.
Remove-Item
(que es quérm
ydel
alias) simplemente-Recurse
no volverá a aparecer en directorios ocultos y, por lo tanto, no eliminará su contenido. Lo que conduce a su error, que no es un "permiso denegado" sino más bien un "directorio no vacío".Para evitar esto, puede pasar el
-Force
parámetro (equivalente a * nix-f
). Entoncesrm -r -force
oRemove-Item -Recurse -Force
debería funcionar.No estoy completamente seguro de cómo está obteniendo un
.git
directorio no oculto : GfW (ciertamente un 2.9.2 anterior) los crea como ocultos para mí. En cmd, ejecuteattrib .git
para verificar si está oculto. Una vez oculto, unRemove-Item -Recurse
funciona sin él-Force
.fuente
.git
como oculto. En una de mis transcripciones describí cómo cambiarle el nombregit
y asegurar que no esté oculto no resuelve el problema en powershell. Agregué esa sección en respuesta a algunos comentarios sobre mi pregunta original.Remove-Item -Recurse
. Y pruebe la-Force
opción sin desarmar oculto..git
directorio tenga elH
atributo, sino también que los archivos del paquete.git/objects/pack
tengan elR
atributo (solo lectura). Una vez que elimine esos atributos también, finalmente puedo eliminar el repositorio git sin pasar-Force
.