2012-09-07 12 views
5

Estoy usando git en mi máquina con Windows 7, empujando a una carpeta compartida en una máquina Server 2008. Esto ha funcionado perfectamente durante los últimos 6 meses. Sin embargo, desde ayer, ya no puedo presionar al repositorio remoto. Cada vez que intento, me sale el siguiente:git push falla a menos que haga un gc en el repositorio remoto primero

$ git push 
Counting objects: 39, done. 
Delta compression using up to 8 threads. 
Compressing objects: 100% (23/23), done. 
Writing objects: 100% (23/23), 8.42 KiB, done. 
Total 23 (delta 15), reused 0 (delta 0) 
Unpacking objects: 100% (23/23), done. 
error: Couldn't set refs/heads/my-branch 
To //my-server/Code/my-project.git 
! [remote rejected] my-branch -> my-branch (failed to write) 
error: failed to push some refs to '//my-server/Code/my-project.git 

Google para el 'no pudo llevar a algunos árbitros' del error da diferentes resultados sobre no haber tirado primero (estoy completamente al día), y no tener el derecho permisos (tengo acceso completo a todo, y puedo crear/eliminar/editar archivos en el repositorio remoto a través del explorador).

Me encontré con esta entrada de blog http://henke.ws/post.cfm/error-failed-to-push-some-refs que menciona que es posible que deba ejecutar algunos comandos de limpieza en el repositorio remoto. Así que corrí git gc en el repositorio remoto:

$ git gc 
Counting objects: 3960, done. 
Compressing objects: 100% (948/948), done. 
Writing objects: 100% (3960/3960), done. 
Total 3960 (delta 2971), reused 3942 (delta 2964) 

y he aquí, puedo empujar de nuevo!

$ git push 
Counting objects: 39, done. 
Delta compression using up to 8 threads. 
Compressing objects: 100% (23/23), done. 
Writing objects: 100% (23/23), 8.42 KiB, done. 
Total 23 (delta 15), reused 0 (delta 0) 
Unpacking objects: 100% (23/23), done. 
To //my-server/Code/my-project.git 
    8153afd..1385d28 my-branch -> my-branch 

El problema, sin embargo, es que ahora tengo que correr un GC en el repositorio remoto cada vez que quiero hacer un empuje. Si no lo hago, aparece el error "Falló el envío de algunas referencias" nuevamente.

Entonces, ¿por qué mi repos tan arrestado? ¿Cómo puedo solucionar el problema de forma permanente?

+0

No tengo ni idea de Windows, así que es una toma en la oscuridad, pero ¿has revisado los permisos en el servidor? Tal vez, al ejecutar la recolección de basura solo está reescribiendo archivos con sus permisos. – sudarkoff

+0

hav u intentado usar git push origin

+0

permisos parecen como un candidato probable, pero he comprobado y verificado ellas doble, así como quitar y volver a aplicar permissiosn de acceso total, retirado y vuelto a aplicar mi grupo, etc. –

Respuesta

4

Parece que está presionando sobre un recurso compartido de red de windows, en lugar de usar los protocolos ssh o git. Esto significaría que su computadora local tiene que escribir los archivos en el recurso compartido de red y, por lo tanto, podría verse frustrado por cualquier archivo bloqueado o problemas de permisos relacionados con ese servidor.

Al empujar una rama, después de escribir los objetos, git actualizará la referencia para la rama escribiendo en el archivo .git/refs/heads/my-branch. Parece que el archivo no puede escribirse desde su cliente.

Cuando hace un gc, los refs se recopilan de archivos sueltos en el directorio refs y se colocan en un archivo de texto .git/packed-refs, y los archivos ref individuales se eliminan.

Mi teoría es que su impulso está fallando cuando la referencia existe como un archivo suelto en el servidor, porque no tiene permisos para sobrescribir un archivo existente, mientras que tiene permisos para crear archivos nuevos. Después de empaquetar los refs con un gc, el archivo ref ya no existe y, por lo tanto, puede volver a presionar una vez.

Mi sugirieron correcciones son:

  1. verificar si se puede sobrescribir los archivos existentes de usted cliente y si no corregir los permisos o problemas de bloqueo de ficheros
  2. pasar a utilizar el protocolo git, este blog parece ser un buen resumen de las opciones para las ventanas http://freshbrewedcode.com/derekgreer/2012/02/19/hosting-a-git-repository-in-windows/

Como último recurso, si usted se encuentra atascado con la opción de GC, se podría intentar ejecutar 'pack-árbitros git -todas' en su lugar. Será más rápido que solucionar el problema con un gc cada vez.

+0

Gracias por el comentario y la información detallada sobre lo que hace push y gc-ing. Quité y volví a aplicar todos los permisos para los archivos, y también eliminé y volví a aplicar todos los permisos en el * share *, y el problema parece ser solucionado. Supongo que los permisos de compartir estaban causando el problema. –

Cuestiones relacionadas