fatal: detected dubious ownership in repository: solución

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

  1. Confirma que el propietario no coincide. En PowerShell:

    "$env:USERDOMAIN\$env:USERNAME"
    (Get-Acl -LiteralPath 'D:\proyectos\mi-repo').Owner

    Si el segundo valor es distinto del primero (por ejemplo EQUIPO\otro-usuario frente a EQUIPO\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.

  2. 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-repo

    safe.directory admite varios valores, y --add agrega uno nuevo sin reemplazar los anteriores. La excepción vale para esa ruta; si mueves la carpeta, debes agregar la nueva ruta.

  3. 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 status

    La documentación actual de Git incluye la opción -c entre las configuraciones "protegidas" que sí se respetan. En versiones antiguas, la documentación de safe.directory decí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 status y git config --global --get-all safe.directory.

Referencias

Comentarios