¿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.

Bialecki
fuente
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!

Cascabel
fuente
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.

blj
fuente
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.

Jacob Zimmerman
fuente
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

Festus Tamakloe
fuente
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
11

Esto debería solucionarlo:

git config --unset core.bare
Babajide M. Moibi
fuente
5
Si le das una solución. Explique también por qué.
Dejo mi marca el
1
Esto me solucionó el problema.
bpanulla
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.

CB Bailey
fuente
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

usuario1329261
fuente
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

koppor
fuente
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ó.

chethan jain
fuente
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.

Soren Bjornstad
fuente
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

ThorInvocador
fuente
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!

geekie12
fuente
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.

raghavendra
fuente
0

Editó el archivo de configuración y cambió bare = true a bare = false

Murt Moriarty
fuente
0

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

Mendi Barel
fuente