2011-08-22 18 views
9

Necesito git push a control remoto, y ese impulso necesita ser copia de trabajo actual. Porque, fuente empujada es un servidor web. Por lo tanto, los archivos insertados deben estar actualmente en uso. Estoy seguro de que nadie va a editar archivos en el host :)git force push actual directorio de trabajo

Esta pregunta se hace seguimiento de estas 2 preguntas, Is it possible to have a git repo inside another git repo y what difference does --bare switch make when initing a git repo?

Editar: repo desnuda no es lo que quiero, ya que los archivos tienen que estar directamente en la máquina remota, y deben encontrarse en las ubicaciones donde los coloqué.

Edit2: Es mi entendimiento de que repo desnuda no guarda el archivo hieararchy, y guarda los datos en el directorio raíz de pase

Respuesta

10

Aquí está una guía paso a paso sobre cómo crear un repositorio git en su Web host que permitirá los empujones directos, configurarlo como un control remoto para su repositorio local y hacer cambios en él. Tenga en cuenta que debe tener acceso ssh a su servidor web y tener instalado git.

de su servidor Web (en ssh'd):

# create an empty repo on your web host; note its path 
mkdir site 
cd site 
git init 

# configure it to allow pushes to the current checked-out branch 
# without complaining (direct push) 
git config receive.denyCurrentBranch ignore 

Ahora con tu repositorio local (ejecutar estos comandos git dentro de la cesión temporal):

# create the reference to the web host remote for pushing 
# /path/to/the/repo is the path to the repo you made above on the web host: 
# it will be an absolute path OR relative to your ssh chroot (depends on the host) 
git remote add deploy ssh://[email protected]_host/path/to/the/repo 

# finally, push your changes! 
git push deploy master 

Ahora, los cambios han sido empujado al repositorio check-out en el host web. Sin embargo, no se reflejarán en el directorio de trabajo (es decir, sus cambios no tendrán efecto de inmediato). Esto se debe a que ha enviado directamente a la rama activa. Para finalizar, es necesario o bien

  • realizar manualmente un git checkout -f para actualizar el modelo de trabajo dir
  • hacer un gancho git post-receive hacerlo automáticamente.

Para obtener información instantánea, el despliegue automático con un gancho post-receive echa un vistazo a este git site deployment COMO.

+0

hmm, todo lo que necesitaba era recieve.denyCurrentBranch. Gracias :) – yasar

+0

@ yasar11732, asegúrese de leer la nota sobre cómo mantener actualizado el directorio de trabajo. Sin él, los cambios que presione se reflejarán en el historial de git, pero no necesariamente en la rama desprotegida que es su sitio. – shelhamer

+0

phew, fue un trabajo difícil para mí, pero aún así lo logré. ¡Gracias! – yasar

4

Si bien esto es bastante antiguo, es extremadamente desaconsejable empujar a un árbol de trabajo. https://git.wiki.kernel.org/index.php/GitFaq#Unexpected_behavior

Un mejor método sería crear un repositorio vacío que refleje el árbol de trabajo del sitio web.

Todo un repositorio simple, es un repositorio sin árbol de trabajo o mejor dicho sin ningún archivo extraído. La jerarquía existe teniendo en cuenta todas las cosas y se puede verificar. En otras palabras, actúa como host solo para cambios.

Sin conocer la jerarquía de directorios que está trabajando para su web, voy a asumir que es un diseño de página web estándar utilizando el hogar chrooted Ejem:/home/usuario/www

En el servidor usando ssh con git instalado:

crear un árbol de trabajo del sitio actual

cd /home/user/public_html 
git init 
git add . 
git commit -m "Initial Commit" 

crear un repositorio desnudo a empujar a distancia a partir de su sistema local

mkdir /home/user/deploy.git 
cd /home/user/deploy.git 
git init --bare 

Enlace su repositorio árbol de trabajo y su repositorio implementar desnuda

cd /home/user/public_html 
git remote add deploy /home/user/deploy.git 
git remote show deploy 
* remote deploy 
    URL: /home/user/deploy.git 
git push deploy master 

Ahora establecer una nueva operación en el sistema local

git clone ssh://[email protected]/home/user/deploy.git 
git branch -a 
*master 
    remotes/origin/HEAD 
    remotes/origin/master 

Ahora configuración 2 ganchos para hacer al instante cambios en su repo remoto web cuando lo presionas o si alguien más a quien le das acceso empuja hacia él. Desde receive.denyCurrentBranch git config ignorar dará lugar a problemas en el largo plazo

En el servidor remoto permitirá posterior a la actualización para implementar

cd /home/user/deploy.git/hooks 
mv post-update.sample post-update 
vi post-update 

Cambiar su gancho posterior a la actualización de la continuación y guardar el

#!/bin/sh 
echo "Pulling changes into public_html [deploy post-update]" 
cd /home/user/public_html || exit 
unset GIT_DIR 
git pull deploy master 
exec git update-server-info 

Ahora configuramos su árbol de trabajo web para impulsar sus cambios para implementar si algo se ha comprometido a ello.

cd /home/user/public_html/.git/hooks 
mv post-commit.sample post-commit 
vi post-commit 

a continuación, cambiar el gancho post-commit a la siguiente

#!/bin/sh 
echo "Pushing changes to deploy [public_html post-commit]" 
git push deploy 

Usted todavía tiene la opción de pago y envío su árbol de trabajo web, si es necesario. Esto le permitirá sacar sus cambios de la implementación al árbol de trabajo de su web cuando presione el maestro de su sistema local. Puede bifurcar, volver a establecer la base, revertir, etc. sin afectar el árbol de trabajo de su sitio web, sin preocuparse por los marcadores de conflictos, simplemente utilizando el repositorio de despliegue simple. Si necesita más control sobre lo que se ha comprometido, puede usar post-recepción en lugar de o en combinación con la actualización posterior.

Espero que esto ayude a alguien más que busque hacer lo mismo que el OP.

5

Esta pregunta es realmente antigua, pero encontré una solución mucho mejor (para mi situación al menos) que las soluciones que figuran aquí.

Desde el manual para git config, a partir de Git 2.3.0:

Otra opción es "updateInstead" que permitirá actualizar el directorio de trabajo (debe estar limpio) si empujara en la rama actual. Esta opción está destinada a sincronizar directorios de trabajo cuando no se puede acceder fácilmente a un lado a través de ssh interactivo (por ejemplo, un sitio web activo, de ahí el requisito de que el directorio de trabajo esté limpio).

Así que git config receive.denyCurrentBranch updateInstead (en el depósito de recepción) funcionó perfectamente para mí. Me permite presionar y para actualizar el directorio de trabajo del repositorio receptor automágicamente (siempre que ese directorio de trabajo esté limpio cuando se produzca el envío).

Cuestiones relacionadas