¿Por qué recibo el mensaje "fatal: esta operación debe ejecutarse en un árbol de trabajo?"


84

Acabo de instalar git en Windows. Configuré la variable GIT_DIR para que sea c: \ git \ y verifiqué que cygwin mantiene esta variable de entorno (es decir, echo $ GIT_DIR es lo que debería ser). Fui a la carpeta para la que quería crear el repositorio de git, digamos c: \ www, y luego ejecuté:

git init
git add .

Entonces me sale el error:

fatal: This operation must be run in a work tree

No estoy seguro de qué salió mal, pero el directorio c: \ git tiene un archivo de configuración que dice:

[core]
    repositoryformatversion = 0
    filemode = false
    bare = true
    symlinks = false
    ignorecase = true

Estoy bastante seguro de que esto no debería ser simple y ese es nuestro problema.


1
¡GIT_DIR es un concepto completamente diferente a CVSROOT!
innaM

Respuestas:


54

La razón directa del error es que sí, es imposible de usar git-addcon un repositorio simple. Un repositorio simple, por definición, no tiene árbol de trabajo. git-addtoma archivos del árbol de trabajo y los agrega al índice, en preparación para la confirmación.

Sin embargo, es posible que deba pensar un poco en su configuración aquí. GIT_DIR es el directorio de repositorio que se usa para todos los comandos de git. ¿Realmente está tratando de crear un repositorio único para todo lo que rastrea, tal vez cosas en todo su sistema? Un repositorio de git por naturaleza rastrea el contenido de un solo directorio. Deberá establecer GIT_WORK_TREEuna ruta que contenga todo lo que desea rastrear, y luego .gitignoredeberá bloquear todo lo que no está interesado en rastrear.

¿Quizás está tratando de crear un repositorio que solo rastreará c:\www? Entonces deberías ponerlo c:\www(no configures GIT_DIR). Este es el uso normal de git, con el repositorio en el directorio .git del directorio de nivel superior de su "módulo".

A menos que tengas una buena razón, te recomiendo que sigas la forma en que a git le gusta trabajar. Si tiene varias cosas de las que realizar un seguimiento, ¡probablemente desee varios repositorios!


10
1. Solo estamos siguiendo el 'GIT diario en 20 comandos' y git-init (1) manpPage de Linus T. (¿que desafortunadamente puede estar desactualizado?) 2. Su publicación solo sugiere lo que está mal pero no nos da pista sobre qué hacer al respecto

54
Solo git config --unset core.bare.
Matthias Urlichs

Mi problema se resolvió con la respuesta de blj, pero dentro de esa subcarpeta, al usar el git branchcomando, pude enumerar las ramas, pero no pude hacerlo git checkout -b feature22. ¿Eso significa que para enumerar las ramas no se necesita un árbol de trabajo, pero sí lo hace para pagar?
Cariño

203

Además, probablemente esté dentro de la subcarpeta .git, suba una carpeta a la raíz de su proyecto.


7
¡La mejor respuesta que he visto! Debería ser la respuesta aceptada.
GeertVc

Esta es la mejor respuesta. Que alguna vez he visto. pequeño problema. pequeña solución. quiéralo.
Ariful Islam

2
¿Hay alguna forma de suprimir este mensaje?
roachsinai

lol ... me tienes. +1
hongoantrax

17

En caso de que lo que me sucedió le esté sucediendo a otra persona, necesito decir esto: estaba en mi directorio .git dentro de mi proyecto cuando recibí este error. Busqué y busqué respuestas, pero nada funcionó. Todo lo que tenía que hacer era volver al directorio correcto. Fue una especie de momento en la palma de la mano para mí. En caso de que haya alguien más tan tonto como yo, espero que esta respuesta le haya resultado útil.


1
Experiencia similar. En mi caso, estaba usando GitExtensions (para Windows) y al intentar abrir el repositorio, hice clic para abrir el archivo .git en lugar de la carpeta que lo contenía. Se veía bien al principio, pero me dio el error de árbol cuando comencé a hacer algo.
thund

1
Me encanta que esto tenga una docena de votos a favor. Me alegro de haber publicado esta respuesta, aunque parecía algo obvio.
Jacob Zimmerman

12

Simplemente clone el mismo proyecto en otra carpeta y copie la carpeta .git / a su proyecto.

Ejemplo

Crear carpeta temporal:

mkdir temp

cambiar a la carpeta temporal

cd temp/

clona el mismo proyecto en la carpeta temporal :

git clone [-b branchName] git@path_to_your_git_repository

copie la carpeta .git a su proyecto:

cp -R .git/ path/to/your/project/

cambia a tu proyecto y ejecuta git status

elimine la carpeta temporal si ha terminado.

Espero que esto ayude a alguien


1
Encontré esto útil, pero debo decir que la primera línea fue suficiente para que me diera cuenta de lo que estaba mal. El resto me confundió un poco. Muchas gracias de todos modos :)
randombee

@randombee Esto funcionó para mí. . . ¿pero por qué? ¿Qué hace esto?
Yatharth Agarwal


8

La configuración explícita de la GIT_DIRvariable de entorno obliga a git a usar el directorio dado como repositorio de git. Nunca es necesario durante el uso normal.

En su ejemplo, debido a que ha especificado un GIT_DIRy no tiene nombre .git(el punto inicial es importante) y no ha proporcionado una --work-treeopción o establecido la GIT_WORK_TREEvariable de entorno, quiere un repositorio simple cuando dijo git init.

Debido a que un repositorio simple no tiene un árbol de trabajo, una gran selección de comandos no tiene sentido con un repositorio simple. git addes solo uno.

¿Hay alguna razón en particular por la que necesite usar una ubicación no estándar para su repositorio de git, en lugar de una .gitsubcarpeta debajo de la raíz del árbol de trabajo? Si bien es posible arreglar esto, tiende a ser más complicado y más propenso a errores del usuario.


La configuración de GIT_WORK_TREE me resolvió. La razón por la que estoy usando GIT_DIR es que quiero un repositorio de git separado para mi copia de trabajo donde tengo una tarea en segundo plano que solo agrega / confirma cada pocos minutos. Este proceso establece GIT_DIR en .gitsave. Mi trabajo de repositorio real está en .git. Ahora tengo un repositorio de seguimiento en vivo local, así que tengo versiones de todos los archivos a medida que los cambio.
MikeJansen

6

Crea un repositorio GIT simple

Una pequeña perorata: git no puede crear un repositorio desnudo normal por sí mismo. Estúpido imbécil.

Para ser precisos, no es posible clonar repositorios vacíos. Entonces, un repositorio vacío es un repositorio inútil. De hecho, normalmente crea un repositorio vacío y lo llena inmediatamente:

git init
git add .

Sin embargo, git add no es posible cuando creas un repositorio simple:

git --bare init
git add .

da un error "fatal: esta operación debe ejecutarse en un árbol de trabajo".

Tampoco puedes comprobarlo:

Initialized empty Git repository in /home/user/myrepos/.git/
fatal: http://repository.example.org/projects/myrepos.git/info/refs not found: did you run git update-server-info on the server?

git --bare init
git update-server-info # this creates the info/refs file
chown -R <user>:<group> . # make sure others can update the repository

La solución es crear otro repositorio en otro lugar, agregar un archivo en ese repositorio y enviarlo al repositorio simple.

mkdir temp; cd temp
git init
touch .gitignore
git add .gitignore
git commit -m "Initial commit"
git push (url or path of bare repository) master
cd ..; rm -rf temp

espero que esto pueda ayudarte


1
Esto es simplemente falso. Puede crear un repositorio simple y clonarlo. Incluso si fuera cierto, todavía no responde a la pregunta. (Por ejemplo$ git --bare init bare.git Initialized empty Git repository in /home18/cbailey/gittest8/bare.git/ $ git clone bare.git non-bare Cloning into 'non-bare'... \\ done. \\ warning: You appear to have cloned an empty repository.
CB Bailey

Lo siento, si uso "<>" para empaquetar la "URL o ruta del repositorio desnudo", será invisible. y lo que dije al revés es realmente útil. Me he probado y verificado.
user1329261

5

Tuve este problema, porque .git/configcontenido worktree = D:/git-repositories/OldName. Acabo de cambiarlo aworktree = D:/git-repositories/NewName

Descubrí eso, porque usé git gui , que mostraba un mensaje de error más detallado:

error de git gui


1
Usé git bash y recibí un mensaje fatal: this operation must be run in a work tree. Modificar el archivo de configuración lo solucionó para mí.
pawellipowczan

4

En mi caso, estaba en la misma carpeta que el archivo ".git" de mi repositorio. Tuve que subir un nivel de directorio, lo resolvió.


2

Si nada más parece funcionar, vuelva a verificar la ruta git config core.worktree. Si esa ruta no apunta a su directorio de trabajo, es posible que deba actualizarla.

La forma en que obtuve este error fue que creé un repositorio de Git en una unidad de red. Funcionó bien en una computadora pero devolvió este error en otra. Resultó que tenía la unidad asignada a una letra de unidad de Windows en la computadora donde la creé, pero no en la otra computadora, y Git guardó la ruta al árbol de trabajo como la ruta mapeada y no la ruta UNC.


1

Si un pago existente (no desnudo) comienza a dar este error, verifique su archivo .git / config; si core.barees cierto, elimine esa línea de configuración


0

Si ninguna de las formas habituales anteriores le ayuda, observe el seguimiento de la llamada debajo de este mensaje de error ( "fatal: This operation . . .") y localice el script y la línea que está generando el error real. Una vez que ubique esa llamada de error (), desactívela y vea si la operación que está intentando se completa incluso con algunas advertencias / mensajes; ignórelos por ahora. Si es así, finalmente después de completarlo podría mencionar la parte de la operación que no se completó con éxito. Ahora, aborde esta parte por separado según corresponda.

En relación con la lógica anterior con mi caso, recibí este mensaje de error "fatal: This operation . . ."cuando intentaba obtener el código de Android-x86 con repo sync . . .. y el seguimiento de la llamada se mostró raise GitError("cannot initialize work tree")como la llamada error () que causa el mensaje de error anterior ( "fatal: . . ."). Entonces, después de comentar eso GitError()en .repo/repo/project.py, repo sync . . .continuó y finalmente indicó error para tres proyectos que no se sincronizaron correctamente. ¡Acabo de eliminar sus *.gitcarpetas de sus rutas relevantes en el árbol de origen de Android-x86 localmente y ejecuté repo sync . . .nuevamente y probé el éxito!


0

El mismo problema que tengo, hice los siguientes pasos,

  1. git init
  2. git add.
  3. git commit -m "configuración inicial"
  4. git push -f maestro de origen

entonces el trabajo comienza a funcionar.



0

Además, aparentemente, este error ocurrirá si clona en NTFS Ram Drive.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.