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

Acabo de instalar git en Windows. Establecí 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 repository 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 lo que salió mal, pero el directory c: \ git tiene un file de configuration que dice:

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

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

La razón directa del error es que sí, es imposible usar git-add con un repository simple. Un repository desnudo, por definición, no tiene tree de trabajo. git-add toma los files del tree de trabajo y los agrega al índice, en preparación para el commit.

Sin embargo, es posible que tenga que pensar un poco en su configuration aquí. GIT_DIR es el directory de repository utilizado para todos los commands de git. ¿Estás realmente tratando de crear un único repository para todo lo que rastreas, tal vez cosas en todo tu sistema? Un repository git por naturaleza rastrea el contenido de un solo directory. Tendrá que establecer GIT_WORK_TREE en una ruta que contenga todo lo que desea rastrear, y luego necesitará un .gitignore para bloquear todo lo que no le interesa rastrear.

Tal vez estás tratando de crear un repository que rastreará solo c:\www ? Luego debe ponerlo en c:\www (no configure GIT_DIR). Este es el uso normal de git, con el repository en el directory .git del directory de nivel superior de su "module".

A less que tengas una muy buena razón, te recomendaría seguir con la forma en que a Git le gusta trabajar. Si tiene varias cosas que hacer, ¡probablemente quiera varios repositorys!

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

Establecer explícitamente la variable de entorno GIT_DIR fuerza a git a usar el directory dado como el repository de git. Nunca es necesario durante el uso normal.

En su ejemplo, porque ha especificado un GIT_DIR y no se llama .git (el punto --work-tree es importante) y no ha proporcionado una opción --work-tree o configurado la variable de entorno GIT_WORK_TREE , que desea un repository vacío cuando dijiste git init .

Debido a que un repository desnudo no tiene un tree de trabajo, una gran selección de commands no tiene sentido con un repository simple. git add es solo uno.

¿Existe alguna razón particular por la que necesite usar una location no estándar para su repository de git, en lugar de una subcarpeta .git en la raíz del tree de trabajo? Si bien es posible organizar esto, tiende a ser más trabajo y más propenso a los errores del usuario.

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

Ejemplo

Crear una carpeta temporal:

 mkdir temp 

cambiar a la carpeta temp

 cd temp/ 

clonar el mismo proyecto en la carpeta temporal :

 git clone [-b branchName] git@path_to_your_git_repository 

copy la carpeta .git a tu proyecto:

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

cambia a tu proyecto y ejecuta el git status

borre la carpeta temporal si ha terminado.

Espero que esto ayude a alguien

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

Crear un repository GIT desnudo

Una pequeña diatriba: git no puede crear un repository desnudo normal por sí mismo. Estúpido idiota de hecho.

Para ser precisos, no es posible clonar repositorys vacíos. Entonces un repository vacío es un repository inútil. De hecho, normalmente creas un repository vacío y lo llenas inmediatamente:

 git init git add . 

Sin embargo, git add no es posible cuando crea un repository vacío:

 git --bare init git add . 

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

No puedes verificarlo tampoco:

 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 repository en otro lugar, agregar un file en ese repository e insertlo en el repository vacío.

 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 te pueda ayudar

Si ninguna de las forms habituales anteriores lo ayudan, mire la línea de llamada debajo de este post de error ( "fatal: This operation . . ." ) y ubique la secuencia de commands y la línea que genera el error real. Una vez que localice la llamada a error (), desactívela y vea si la operación que está intentando completa incluso con algunas advertencias / posts; ignórelas por el momento. Si es así, finalmente, después de completarlo, podría mencionar la parte de la operación que no se completó con éxito. Ahora, dirija esta parte por separado, según corresponda.

Relacionado con la lógica de mi caso, recibí este post de error como "fatal: This operation . . ." cuando estaba tratando de get el código Android-x86 con la repo sync . . . repo sync . . . . y el rastreo de llamada mostró raise GitError("cannot initialize work tree") como la llamada de error () que causa el post de error anterior ( "fatal: . . ." ). Entonces, después de comentar que GitError() en .repo/repo/project.py , repo sync . . . repo sync . . . continuación y finalmente error indicado para tres proyectos que no se sincronizaron correctamente. Acabo de eliminar sus carpetas *.git de sus routes relevantes en el tree fuente de Android-x86 localmente y ejecuté la repo sync . . . repo sync . . . de nuevo y probado el éxito!

Tuve este problema, porque .git/config contenía worktree = D:/git-repositories/OldName . Lo cambié a worktree = D:/git-repositories/NewName

Lo descubrí porque usé git gui , que mostraba un post de error más detallado:

error de git gui