Abres una carpeta con un repositorio, ejecutas cualquier comando de Git y todos fallan con este mensaje:
fatal: detected dubious ownership in repository at 'D:/proyectos/mi-repo'
To add an exception for this directory, call:
git config --global --add safe.directory D:/proyectos/mi-repo
Según la versión de Git, entre ambas líneas puede aparecer información sobre el propietario de la carpeta y el usuario actual. Este artículo explica qué está protegiendo Git, cómo agregar la excepción correcta en Windows y por qué conviene evitar el comodín * que aparece en muchas respuestas.
Por qué pasa
La documentación de Git explica que, por defecto, se niega a leer siquiera la configuración de un repositorio cuyo propietario es otro usuario, y mucho menos a ejecutar sus hooks. La razón es de seguridad: la configuración y los hooks de un repositorio pueden ejecutar comandos, así que Git no los acepta de una carpeta que controla otra persona.
En Windows, Git compara el propietario de la carpeta (un identificador de seguridad, o SID) con el usuario que ejecuta el comando. Si no coinciden, aparece el error. Se ha visto en estos casos:
- La carpeta la creó otro usuario.
- El repositorio se copió desde otra máquina.
- El repositorio está en un disco sincronizado.
Las versiones iniciales de esta protección mostraban otro texto: fatal: unsafe repository ('...' is owned by someone else). Es el mismo problema con el mismo arreglo.
Solución
-
Confirma que el propietario no coincide. En PowerShell:
"$env:USERDOMAIN\$env:USERNAME" (Get-Acl -LiteralPath 'D:\proyectos\mi-repo').OwnerSi el segundo valor es distinto del primero (por ejemplo
EQUIPO\otro-usuariofrente aEQUIPO\tu-usuario), esa es la causa. Antes de continuar, asegúrate de que confías en el contenido de esa carpeta: la excepción hace que Git vuelva a aceptar su configuración y sus hooks. -
Agrega la excepción de forma permanente, solo para ese repositorio. Usa la ruta exacta que muestra el mensaje, con barras normales:
git config --global --add safe.directory D:/proyectos/mi-reposafe.directoryadmite varios valores, y--addagrega uno nuevo sin reemplazar los anteriores. La excepción vale para esa ruta; si mueves la carpeta, debes agregar la nueva ruta. -
Si solo necesitas ejecutar un comando una vez, pasa la opción por línea de comandos en lugar de guardarla:
git -c safe.directory=D:/proyectos/mi-repo statusLa documentación actual de Git incluye la opción
-centre las configuraciones "protegidas" que sí se respetan. En versiones antiguas, la documentación desafe.directorydecía que se ignoraba cuando se pasaba con-c; si en tu versión no funciona, actualiza Git o usa el paso 2.
Cómo verificar que quedó resuelto
git status
git config --global --get-all safe.directory
El primer comando debe mostrar el estado del repositorio sin el fatal. El segundo debe listar la ruta que agregaste (una línea por cada excepción). Para confirmar que puedes trabajar con normalidad, crea y borra una rama de prueba:
git switch -c prueba-propietario
git switch -
git branch -d prueba-propietario
Variantes y errores relacionados
No uses safe.directory '*'
git config --global --add safe.directory '*' # evítalo
Funciona, pero según la documentación de Git, el valor * desactiva por completo esta comprobación de seguridad. Dejas sin protección todos los repositorios del equipo, incluidos los que descargues o recibas de terceros en el futuro. Agrega solo las rutas en las que confías.
Agregarlo en el .git/config del repositorio no sirve
Git solo respeta safe.directory en la configuración protegida: la del sistema, la global y la de línea de comandos. Si lo escribes en el archivo de configuración del propio repositorio, se ignora, porque de lo contrario cualquier repositorio podría declararse seguro a sí mismo.
Revisa la carpeta antes de confiar en ella
Si el repositorio viene de una persona o de una máquina que no controlas, abre con un editor de texto el archivo .git/config y la carpeta .git/hooks antes de agregar la excepción. Son justo los elementos que Git no quiere ejecutar sin tu confirmación.
Quitar o revisar excepciones
Para revisar todas las excepciones usa git config --global --get-all safe.directory; con git config --show-origin --get-all safe.directory verás además de qué archivo viene cada valor. Estas excepciones se guardan en tu configuración global (por ejemplo, el archivo .gitconfig de tu carpeta de usuario). Para borrar alguna, abre ese archivo con git config --global --edit y elimina la línea correspondiente.
Alternativa: corregir el propietario
Si la carpeta debería pertenecerte, otra opción es cambiar su propietario al usuario actual con las herramientas de permisos de Windows (esto suele requerir permisos de administrador). A diferencia de safe.directory, resuelve la causa en lugar de aceptar la diferencia.
Resumen
- El error significa que el propietario de la carpeta no es el usuario que ejecuta Git; es una protección, no un fallo del repositorio.
- La solución permanente es
git config --global --add safe.directory D:/ruta/exacta, una vez por repositorio y con la ruta tal como la muestra el mensaje. - Para un único comando puedes usar
git -c safe.directory=... status, si tu versión de Git lo admite. - Evita el valor
*: desactiva la protección para todos los repositorios. - Verifica con
git statusygit config --global --get-all safe.directory.
Comentarios
Publicar un comentario