¿Cómo enviar a un repositorio Git no desnudo?


Normalmente trabajo en un servidor remoto a través de ssh (screen y vim), donde tengo un repositorio Git. A veces no estoy en línea, por lo que tengo un repositorio separado (clonado desde mi control remoto) en mi computadora portátil.

Sin embargo, no puedo extraer de este repositorio en el lado remoto porque normalmente estoy detrás de un firewall o no tengo una IP pública.

He leído que debería enviar solo a un repositorio desnudo. ¿Cómo debo enviar mis cambios a mi repositorio remoto?

5 answers

receive.denyCurrentBranch updateInstead

Esta opción se agregó en Git 2.3, y hace que el servidor actualice su árbol de trabajo si está limpio.

Así que si te aseguras de que siempre confirmas antes de tirar localmente, y mantienes un árbol de trabajo limpio en el servidor (lo que deberías hacer para evitar tener conflictos de fusión), entonces esta opción es una buena solución.

Uso de la 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
 93
Author: Ciro Santilli 新疆改造中心 六四事件 法轮功,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-28 08:28:46

Mejor opción

Probablemente la forma más limpia, menos confusa y más segura de ingresar a su repositorio remoto no desnudo, es ingresar a ramas dedicadas en el remoto que representan las ramas de su computadora portátil.

Veamos el caso más simple, y asumamos que solo tienes una rama en cada repositorio: master. Al presionar el repositorio remoto desde su computadora portátil, en lugar de presionar master -> master, presione master -> laptop-master (o un nombre similar). De esta manera el empuje no afecta la rama maestra actualmente descargada en el repositorio remoto. Para hacer esto desde el portátil, el comando es bastante simple:

git push origin master:laptop-master

Esto significa que la rama maestra local será empujada a la rama llamada "laptop-master" en el repositorio remoto. En su repositorio remoto, tendrá una nueva rama llamada "laptop-master" que luego puede fusionar en su maestro remoto cuando esté listo.

Alternativa

También es posible simplemente pulsar master - > master, pero por lo general, no se recomienda empujar a la rama actualmente registrada de un repositorio no desnudo, porque puede ser confuso si no entiendes lo que está pasando. Esto se debe a que empujar a una rama checked-out no actualiza el árbol de trabajo, por lo que comprobar git status en la rama checked-out en la que fue empujado mostrará exactamente las diferencias opuestas como lo que fue empujado más recientemente. Sería especialmente confuso si el árbol de trabajo estaba sucio antes de que se hiciera el empuje, que es una gran razón por la que esto no es recomendable.

Si desea intentar simplemente presionar master - > master, entonces el comando es simplemente:

git push origin

Pero cuando regrese al repositorio remoto, lo más probable es que desee hacer un git reset --hard HEAD para sincronizar el árbol de trabajo con el contenido que se envió. Esto puede ser peligroso, porque si hay algún sin confirmar cambios en el árbol de trabajo remoto que quería mantener, los borrará. Asegúrese de saber cuáles son las consecuencias de esto ante usted pruébelo, o al menos hacer una copia de seguridad primero!

EDITAR Desde Git 2.3, puedes usar "push-to-deploy" git push: https://github.com/blog/1957-git-2-3-has-been-released . Pero empujar a una rama separada y luego fusionar suele ser mejor, ya que hace una fusión real (por lo tanto, funciona con cambios no confirmados al igual que la fusión).

 139
Author: Dan Moulding,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-24 00:25:21

Sugeriría tener un repositorio desnudo y un repositorio local de trabajo (no desnudo) en su servidor. Puede empujar los cambios de la computadora portátil al repositorio desnudo del servidor y luego extraer de ese repositorio desnudo al repositorio de trabajo del servidor. La razón por la que digo esto es porque es posible que tenga muchas ramas completas/incompletas en el servidor que querrá replicar en la computadora portátil.

De esta manera, no tiene que preocuparse por el estado de la rama que se ha extraído en el repositorio de trabajo del servidor mientras envía cambios al servidor.

 14
Author: Manish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-07 16:34:57

Otra opción es configurar un túnel ssh inverso para que pueda tirar en lugar de empujar.

# start the tunnel from the natted box you wish to pull from (local)
$ ssh -R 1234:localhost:22 user@remote

# on the other box (remote)
$ git remote add other-side ssh://user@localhost:1234/the/repo
$ git pull other-side

Y si desea que el túnel se ejecute en segundo plano

$ ssh -fNnR 1234:localhost:22 user@remote
 2
Author: Todd Freed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-23 16:58:23

Puedes hacer:

$git config --bool core.bare true

Esto se puede hacer en repositorio desnudo o central para que acepte cualquier archivo que se envíe desde repositorios no desnudos. Si hace esto en un repositorio no desnudo, entonces no podemos enviar ningún archivo desde un repositorio no desnudo a desnudo.

Si está practicando GIT creando un repositorio central y no desnudo en PC, puede que no muestre los archivos empujados en algunos PC, pero ha sido empujado. puedes comprobarlo corriendo.

$git log en central repo.

Aparte de si envías a GitHub, mostrará los archivos allí.

 0
Author: vidwan reddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-20 20:45:50