2010-02-10 17 views
45

He creado un repositorio remoto y puede empujar a nuevos cambios en él, pero no puede recuperar de ella, siempre me dan la (críptica) Mensaje de error:negarse git para ir a buscar en la rama actual

fatal: Refusing to fetch into current branch refs/heads/master of non-bare repository 
fatal: The remote end hung up unexpectedly 

Qué significa eso? ¿Qué debo hacer para habilitar la recuperación?

(Tenga en cuenta que este repositorio remoto solo se utiliza como repositorio de copia de seguridad, por lo que debería ser una copia exacta de mi repositorio local. Realmente no puedo entender por qué puedo presionarlo pero no recuperarlo. ..)

Mi config parece:

[remote "origin"] 
    url = ssh://blablablah 
    fetch = +refs/*:refs/* 
    mirror = true 
+0

¿Puede mostrar su configuración para el repositorio que está buscando? –

+0

Mmh, ¿cómo puedo ver esa configuración? Acabo de configurar ese repositorio remoto usando 'git remote add name server', quizás con la opción' --mirror'. –

+0

Oliver, la configuración está en '.git/config'. En particular, Charles está hablando de la sección '[remota ...]', creo. –

Respuesta

24

lo que estamos tratando de hacer es buscar a la rama que está workin sobre. Es decir, es en la rama principal e intenta actualizarlo. Eso no es posible. Es más común actualizar las ramas remotes/* y luego tirar de ellas a las locales. Lo que queremos es, quizás,

git remote add otherrepo thehost:/the/path.git 

Eso será repositorio de configuración que se debe buscar en remotes/otherrepo/*. git fetch otherrepo debería hacer el truco. Alternativeley, puede editar manualmente su .git/config y establecer fetch para el control remoto a algo así como refs/heads/*:refs/remotes/otherrepo/*.

+0

Gracias! Realmente no entiendo lo que estoy haciendo, pero siguiendo tus consejos ahora funciona bien. Creo que hay que decir explícitamente dónde terminarán las sucursales remotas en el repositorio local; Probablemente tuve la rama remota solapando mi rama local, aunque no estoy seguro si eso tiene sentido. :-) ¡Gracias de cualquier manera! –

+1

Más o menos. El hecho de que los refs remotos se encuentren en "refs/remotes" es solo una convención, pero realmente no se quiere ir directamente a su "refs/hreads/master". Especialmente, cuando su "refs/heads/master" está desprotegido. –

+0

@ MichaelKrelin-hacker ¿qué debo escribir en lugar de "thehost" –

1

Tuve este problema cuando cloné sin pensar un repositorio en lugar de ir a buscarlo, por lo que ambos repositorios eran maestros. Si no ha trabajado en el repositorio remoto, puede arreglar las cosas con los comandos git básicos de la siguiente manera: (1) elimine el repositorio remoto, (2) copie el repositorio local donde estaba el remoto, (3) elimine el un local, y luego (4) estableció el repositorio local utilizando

git init; git fetch $REMOTE_GIT_REPOSITORY_URL 

entonces git pull y git push va a hacer las cosas correctas. La ventaja de evitar git remote, según la respuesta más eficiente y basada en principios de Michael, es que no necesita pensar en la semántica de rastrear ramales.

+0

Un clon es un clon.El "repo maestro" es puramente una convención. La pregunta aquí es sobre el comportamiento de "git fetch remote ref: ref" cuando HEAD está configurado como ref. – qneill

35

En caso de que alguien encuentre esto porque quiere buscar específicamente en la sucursal actual, puede usar el indicador --update-head-ok. De the docs:

-u
--update-cabeza-ok
Por git por defecto ir a buscar niega a actualizar la cabeza que corresponde a la rama actual. Esta bandera desactiva el cheque. Esto es solo para el uso interno de git pull para comunicarse con git fetch, y a menos que esté implementando su propia porcelana, se supone que no debe usarla.

En algunos casos, queremos implementar nuestros propios comandos de porcelana, por ejemplo, automatización y herramientas.

+1

¿Por qué Git no quiere actualizar el cabezal en este caso? ¿Por qué no quieren que uses esta bandera? –

+0

También tengo curiosidad, ¿por qué está bien buscar para actualizar todas las otras ramas excepto la actual? – cdosborn

+0

Pensé que la restricción estaba allí para evitar que perdiera trabajo, pero verifiqué que incluso con la bandera '-u' se rechazan las confirmaciones de avance rápido: '! [rechazado] maestro -> maestro (avance rápido) ' –

-1

Tengo el mismo problema. Primero trato de buscar utilizando este

git fetch [remote_name] [branch_name] 

Tuve el mismo problema que usted menciona. Después de eso probé este simple comando.

git pull [remote_name] [branch_name] 

Nota buscará y fusionará los cambios. Si usa el terminal y luego el archivo abierto, debe enviar un mensaje. Con este mensaje, presionarás la última confirmación. Pruebe este comando y finalmente podrá enviar la solicitud.

git push [remote_name] [branch_name_local] 
0

También este Esto debería funcionar si se encuentra en maestro rama y quiere obtener la última prueba este origen tirón

git maestro

0

¿En realidad escribir Git comandos en la línea de comandos, o está ejecutando el ejecutable Git desde su propio código?
Si lo está ejecutando desde el código, ¿está seguro de que Git está intentando buscar en el directorio local correcto?

Hay dos posibles maneras de hacer esto:

  1. Use las opciones proporcionadas por el lenguaje de programación para establecer el directorio de trabajo correcta antes de ejecutar Git
    (C# example, porque eso es lo que soy usando)

  2. Pase siempre the -C parameter a Git para especificar el directorio con el repositorio local.


que tienen un proyecto en el que estoy llamando a la Git ejecutable desde el código C#, y me dieron el mismo mensaje de error como en la pregunta cuando accidentalmente se olvidó de establecer el -C parameter.

Cuestiones relacionadas