maestro (rama actualmente está desprotegido)''/> maestro (rama actualmente está desprotegido)''/> maestro (rama actualmente está desprotegido)''/> Error de inserción de Git 'maestro [remoto rechazado] -> maestro (rama actualmente está desprotegido)' | programandonet.com

Pregunta Error de inserción de Git 'maestro [remoto rechazado] -> maestro (rama actualmente está desprotegido)'


Ayer, publiqué una pregunta sobre cómo clonar Git repositorio de una de mis máquinas a otra, ¿Cómo puedo 'git clonar' desde otra máquina?.

Ahora puedo clonar con éxito un repositorio de Git desde mi fuente (192.168.1.2) a mi destino (192.168.1.1).

Pero cuando hice una edición de un archivo, git commit -a -m "test" y un git push, Obtengo este error en mi destino (192.168.1.1):

git push                                                
hap@192.168.1.2's password: 
Counting objects: 21, done.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (11/11), 1010 bytes, done.
Total 11 (delta 9), reused 0 (delta 0)
error: refusing to update checked out branch: refs/heads/master
error: By default, updating the current branch in a non-bare repository
error: is denied, because it will make the index and work tree inconsistent
error: with what you pushed, and will require 'git reset --hard' to match
error: the work tree to HEAD.
error: 
error: You can set 'receive.denyCurrentBranch' configuration variable to
error: 'ignore' or 'warn' in the remote repository to allow pushing into
error: its current branch; however, this is not recommended unless you
error: arranged to update its work tree to match what you pushed in some
error: other way.
error: 
error: To squelch this message and still keep the default behaviour, set
error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To git+ssh://hap@192.168.1.2/media/LINUXDATA/working
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'git+ssh://hap@192.168.1.2/media/LINUXDATA/working'

Estoy usando dos versiones diferentes de Git (1.7 en el control remoto y 1.5 en la máquina local). ¿Es esa una posible razón?


877
2018-05-12 06:06


origen


Respuestas:


Simplemente puede convertir su repositorio remoto en un repositorio simple (no hay una copia de trabajo en el repositorio simple, la carpeta contiene solo los datos reales del repositorio).

Ejecute el siguiente comando en su carpeta de repositorio remoto:

git config --bool core.bare true

A continuación, elimine todos los archivos, excepto .git en esa carpeta. Y luego podrás realizar git push al repositorio remoto sin ningún error.


1066
2017-07-14 22:45



Acabo de tener el mismo error mientras comencé a aprender Git. ¡Algunas de las otras respuestas claramente no son para alguien nuevo en Git!

(Voy a usar términos no técnicos para transmitir la idea). De todos modos, lo que está sucediendo es que tienes dos repositorios, uno es el original que primero hiciste, y el otro el trabajo que acabas de crear.

En este momento está en su repositorio de trabajo y está utilizando la rama "principal". Pero también está "conectado" en su repositorio original a la misma rama "principal". Ahora que estás "conectado" en el original, Git teme que lo arruines porque podrías estar trabajando en el original y arruinando las cosas. Por lo tanto, debe volver al repositorio original y hacer un "git checkout someotherbranch", y ahora puede presionar sin problemas.

Espero que esto ayude.


644
2018-05-29 03:26



El mensaje de error describe lo que sucedió. Las versiones más modernas de Git se niegan a actualizar una rama mediante un push si esa rama está desprotegida.

La forma más fácil de trabajar entre dos repositorios no vacíos es o bien para

  1. siempre actualice los repositorios mediante extracción (o búsqueda y combinación) o, si es necesario,

  2. presionando a una rama separada (una rama de importación) y luego fusionando esa rama a la rama principal en la máquina remota.

El motivo de esta restricción es que la operación de inserción solo funciona en el repositorio de Git remoto, no tiene acceso al índice y al árbol de trabajo. Entonces, si se permite, un impulso en la sucursal retirada cambiaría la  HEAD  ser inconsistente con el índice y el árbol de trabajo en el repositorio remoto.

Esto haría que sea muy fácil cometer accidentalmente un cambio que deshaga todos los cambios presionados y también hace que sea muy difícil distinguir entre los cambios locales que no se han cometido y las diferencias entre los nuevos HEAD, el índice y el árbol de trabajo que han sido causados ​​por el movimiento de empuje HEAD.


118
2018-05-12 06:21



Resumen

No se puede presionar en la única rama desprotegida de un repositorio porque podría interferir con el usuario de ese repositorio de una manera que probablemente terminará con pérdida de datos e historial. Pero puede presionar a cualquier otra rama del mismo repositorio.

Como los repositorios simples nunca tienen una rama desprotegida, siempre puede enviarla a cualquier rama de un repositorio vacío.

Existen múltiples soluciones, según sus necesidades.

Solución 1: Use un Repostiory simple

Como se sugiere, si en una máquina no necesita el directorio de trabajo, puede pasar a un repositorio simple. Para evitar jugar con el repositorio, simplemente puede clonarlo:

machine1$ cd ..
machine1$ mv repo repo.old
machine1$ git clone --bare repo.old repo

Ahora puedes enviar todo lo que quieras a la misma dirección que antes.

Solución 2: Empujar a una sucursal sin control

Pero si necesita verificar el código en su control remoto <remote>, entonces puedes usar una rama especial para empujar. Digamos que en su repositorio local ha llamado a su control remoto origin y estás en la rama maestro. Entonces podrías hacer

machine2$ git push origin master:master+machine2

Entonces necesitas fusionarlo cuando estás en el origin repositorio remoto:

machine1$ git merge master+machine2

Autopsia del problema

Cuando se desprotege una sucursal, la confirmación agregará una nueva confirmación con la cabeza de la sucursal actual como su padre y moverá la cabeza de la sucursal para que sea la nueva confirmación.

Asi que

A ← B
    ↑
[HEAD,branch1]

se convierte

A ← B ← C
        ↑
    [HEAD,branch1]

Pero si alguien pudiera presionar a esa rama en medio, el usuario se metería en lo que llamadas git cabeza separada modo:

A ← B ← X
    ↑   ↑
[HEAD] [branch1]

Ahora el usuario ya no está en la rama1, sin haber solicitado explícitamente verificar otra rama. Peor, el usuario ahora está fuera de cualquier rama, y cualquier compromiso nuevo será solo colgado:

      [HEAD]
        ↓
        C
      
A ← B ← X
        ↑
       [branch1]

Hipotéticamente, si en este punto, el usuario visita otra sucursal, entonces este compromiso pendiente se convierte en un juego justo para Git recolector de basura.


102
2018-02-14 16:28



Puede evitar esta "limitación" editando el .git/config en el servidor de destino Agregue lo siguiente para permitir que un repositorio de git sea enviado incluso si está "desprotegido":

[receive]
denyCurrentBranch = warn

o

[receive]
denyCurrentBranch = false

El primero permitirá el empuje mientras advierte de la posibilidad de estropear la rama, mientras que el segundo lo permitirá silenciosamente.

Esto se puede usar para "implementar" código en un servidor que no está destinado a la edición. Este no es el mejor enfoque, sino uno rápido para implementar código.


52
2017-12-16 05:17



Me gusta la idea de tener un repositorio utilizable en el cuadro remoto, pero en lugar de una rama ficticia, me gusta usar:

git checkout --detach

Esta parece ser una característica muy nueva de Git - Estoy usando la versión de Git 1.7.7.4.


38
2018-02-14 20:37



git config --local receive.denyCurrentBranch updateInstead

https://github.com/git/git/blob/v2.3.0/Documentation/config.txt#L2155

Úselo en el repositorio del servidor, y también actualiza el árbol de trabajo si no ocurre una sobrescritura sin seguimiento.

Fue agregado en Git 2.3 como mencionado por VonC en los comentarios

He compilado Git 2.3 y lo he probado. Uso de muestra:

git init server
cd server
touch a
git add .
git commit -m 0
git config --local receive.denyCurrentBranch updateInstead

cd ..
git clone server local
cd local
touch b
git add .
git commit -m 1
git push origin master:master

cd ../server
ls

Salida:

a
b

Hurra, b ¡Me empujaron!


31
2018-02-07 14:57