He resuelto algunos conflictos de combinación, me comprometí y luego intenté impulsar mis cambios y recibí el siguiente error:
c:\Program Files (x86)\Git\bin\git.exe push --recurse-submodules=check "origin" master:master
Done
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To C:/Development/GIT_Repo/Project
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'C:/Development/GIT_Repo/Project'
¿Alguien sabe qué podría estar causando este error?
git config receive.denyCurrentBranch=updateInstead
: stackoverflow.com/a/28262104/6309Respuestas:
Motivo: está empujando a un repositorio no descubierto
Hay dos tipos de repositorios: desnudos y no desnudos.
Los repositorios desnudos no tienen una copia que funcione y puede enviarlos a ellos. ¡Esos son los tipos de repositorios que obtienes en Github! Si desea crear un repositorio simple, puede usar
Entonces, en resumen, no puede empujar a un repositorio no descubierto(Editar: Bueno, no puede pasar a la rama actualmente desprotegida de un repositorio. Con un repositorio desnudo, puede pasar a cualquier rama ya que ninguna está desprotegida. Aunque es posible, no es común pasar a repositorios no desnudos) . Lo que puede hacer es buscar y fusionarse desde el otro repositorio. Así es como funciona lopull request
que puedes ver en Github. Les pides que se alejen de ti y no los empujas a la fuerza.Actualización : Gracias a VonC por señalar esto, en las últimas versiones de git (actualmente 2.3.0), es posible pasar a la rama desprotegida de un repositorio no desnudo . Sin embargo, todavía no puede empujar a un árbol de trabajo sucio , que de todos modos no es una operación segura.
fuente
git config receive.denyCurrentBranch=updateInstead
: stackoverflow.com/a/28262104/6309Resolví este problema verificando primero que el control remoto no tenía nada verificado (realmente no se suponía que lo hiciera), y luego lo descubrí con:
Después de ese empujón git funcionó bien.
fuente
git config core.bare false
ygit reset --hard
?Resumen
No puede pasar a la rama desprotegida de un repositorio porque se dañaría con el usuario de ese repositorio de una manera que probablemente terminará con la pérdida de datos e historial . Pero puede empujar a cualquier otra rama del mismo repositorio.
Como los repositorios desnudos nunca tienen una rama desprotegida, siempre puede pasar a cualquier rama de un repositorio desnudo.
Autopsia del problema
Cuando se desprotege una rama, la confirmación agregará una nueva confirmación con el encabezado de la rama actual como padre y moverá la cabeza de la rama para que sea ese nuevo compromiso.
Entonces
se convierte
Pero si alguien pudiera empujar a esa rama intermedia, el usuario se pondría en lo que git llama modo de cabeza separada :
Ahora el usuario ya no está en la rama1, sin haber pedido explícitamente que revise otra rama. Peor aún, el usuario ahora está fuera de cualquier rama , y cualquier nueva confirmación simplemente estará colgando :
Hipotéticamente, si en este punto, el usuario comprueba otra rama, entonces este compromiso colgante se convierte en un juego justo para el recolector de basura de Git .
fuente
cd en el directorio repo / que está presionando en la máquina remota e ingrese
fuente
Para mí, lo siguiente hizo el truco:
git config --global receive.denyCurrentBranch updateInstead
Configuré la unidad F :, casi en su totalidad, para sincronizar entre mi escritorio de Windows 10 y mi computadora portátil con Windows 10, usando Git. Terminé ejecutando el comando anterior en ambas máquinas.
Primero compartí la unidad F del escritorio en la red. Luego pude clonarlo en mi computadora portátil ejecutando:
F: git clone 'file://///DESKTOP-PC/f'
Desafortunadamente, todos los archivos terminaron en "F: \ f \" en mi computadora portátil, no en F: \ directamente. Pero pude cortarlos y pegarlos manualmente. Git todavía trabajó desde la nueva ubicación después.
Luego intenté hacer algunos cambios en los archivos de la computadora portátil, comprometerlos y volver a colocarlos en el escritorio. Eso no funcionó hasta que ejecuté el comando git config mencionado anteriormente.
Tenga en cuenta que ejecuté todos estos comandos desde Windows PowerShell, en ambas máquinas.
ACTUALIZACIÓN: Todavía tenía problemas para impulsar los cambios, en algunos casos. Finalmente, comencé a realizar cambios, ejecutando lo siguiente en la computadora en la que quiero obtener los últimos commit (s) para:
git pull --all --prune
fuente
git config receive.denyCurrentBranch updateInstead
Como ya hay un repositorio existente, ejecutándose
en el repositorio remoto debería ser suficiente
De la documentación de core.bare
Si es verdadero (desnudo = verdadero), se supone que el repositorio está vacío sin ningún directorio de trabajo asociado. Si este es el caso, se deshabilitarán varios comandos que requieren un directorio de trabajo, como git-add o git-merge (pero podrá presionarlo).
Git-clone o git-init adivinan automáticamente esta configuración cuando se crea el repositorio. Por defecto, se supone que un repositorio que termina en "/.git" no está vacío (desnudo = falso), mientras que se supone que todos los demás repositorios están desnudos (desnudo = verdadero).
fuente
TLDR
git pull &&& git push
.git push origin master:foo
y combínelo en un repositorio remoto.-f
(denyCurrentBranch
debe ignorarse).Básicamente, el error significa que su repositorio no está actualizado con el código remoto (su índice y árbol de trabajo es inconsistente con lo que presionó).
Normalmente,
pull
primero debe obtener los cambios recientes ypush
nuevamente.Si no ayuda, intente ingresar a una rama diferente, por ejemplo:
luego combine esta rama en el repositorio remoto con master.
Si cambió intencionalmente algunas confirmaciones pasadas a través de
git rebase
y desea anular el repositorio con sus cambios, probablemente desee forzar la inserción agregando-f
/--force
parámetro (no recomendado si no lo hizorebase
). Si todavía no funciona, usted necesita fijarreceive.denyCurrentBranch
aignore
del mando a distancia como se sugiere en un mensaje a través de git:fuente
Tal vez su repositorio remoto esté en la rama que desea empujar. Puede intentar pagar otra sucursal en su máquina remota. Hice esto, entonces estos errores desaparecieron, y llevé el éxito a mi repositorio remoto. Tenga en cuenta que uso ssh para conectar mi propio servidor en lugar de github.com.
fuente
Tengo este error porque el repositorio git se inicializó (accidentalmente) dos veces en la misma ubicación: primero como un repositorio no desnudo y poco después como un repositorio desnudo. Debido a que la carpeta .git permanece, git asume que el repositorio no está desnudo. Eliminar la carpeta .git y los datos del directorio de trabajo resolvió el problema.
fuente
.git
carpeta en el control remoto me permitió empujar la confirmación inicial.Recibí este error cuando estaba jugando mientras leía progit. Hice un repositorio local, luego lo busqué en otro repositorio en el mismo sistema de archivos, hice una edición e intenté empujar. Después de leer la respuesta de NowhereMan, una solución rápida fue ir al directorio "remoto" y verificar temporalmente otra confirmación, presionar desde el directorio en el que hice los cambios, luego regresar y volver a poner la cabeza en el maestro.
fuente