trucos tag remota rama que name hace conectar con commits commands comentarios cambiar git git-submodules git-bare

remota - git tag name



Submódulo de Git en el desnudo remoto (3)

Configuré mi entorno para que pueda acceder a un repositorio remoto, utilicé estos comandos para configurar el repositorio remoto:

$ mkdir ~/website.git && cd ~/website.git $ git init --bare

Y

$ cat > hooks/post-receive #!/bin/sh GIT_WORK_TREE=/var/www/website git checkout -f $ chmod +x hooks/post-receive

Y en mi entorno local:

$ git remote add web ssh://website.com/home/website.git $ git push web +master:refs/heads/master

Ahora puedo implementarlo en este control remoto usando git push web y todo funciona bien ...

El problema: Submódulos

Tengo algunos submódulos en mi proyecto que no se están inicializando / actualizando en el repositorio remoto ... No puedo ejecutar la git submodule update en el campo desnudo porque está vacío, y no puedo ejecutarlo en /var/www/website carpeta del /var/www/website porque es solo una copia de los archivos y no un git repo.


Me tropecé con este hilo hace dos días mientras luché con el mismo problema. Después de llegar finalmente a una solución agradable y ordenada, escribí un artículo al respecto aquí:

Git push con submódulos: una guía práctica

Me di cuenta de que si voy a push a un repositorio desnudo, solo para usar post-receive para incorporar un repositorio no vacío, también podría mantenerlo simple y push directamente al repositorio no vacío. Este es un caso claro en el que la "mejor práctica" de impulsar solo a un repos repo solo está agregando complejidad.

En caso de link rot, pegaré mi solución aquí, omitiendo los bits donde encuentro todos los mismos problemas que estoy seguro que hicieron.

Primero, creemos un gancho post-receive universal , uno que no necesite cambiar por repositorio:

[aaron@aaronadams]$ cat > /usr/local/share/git-core/templates/hooks/post-receive.sample #!/bin/sh # # An example hook script to update the working tree, including its # submodules, after receiving a push. # # This hook requires core.worktree to be explicitly set, and # receive.denyCurrentBranch to be set to false. # # To enable this hook, rename this file to "post-receive". # Read standard input or hook will fail while read oldrev newrev refname do : done # Unset GIT_DIR or the universe will implode unset GIT_DIR # Change directory to the working tree; exit on failure cd `git config --get core.worktree` || exit # Force checkout git checkout --force # Force update submodules git submodule update --init --recursive --force [aaron@aaronadams]$ chmod +x /usr/local/share/git-core/templates/hooks/post-receive.sample

Ahora adelante y rompamos todas las reglas.

Vamos a inicializar un repositorio de Git no puro, directamente en el directorio de nuestro sitio web; asegúrese de que pueda recibir de git push ; establece explícitamente su árbol de trabajo en su directorio principal; y habilite nuestro gancho que acabamos de crear.

[aaron@aaronadams]$ cd /var/www/vhosts/aaronadams.ca/sites/staging.aaronadams.ca [aaron@aaronadams]$ git init && git config --bool receive.denyCurrentBranch false && git config --path core.worktree ../ && mv .git/hooks/post-receive.sample .git/hooks/post-receive Initialized empty Git repository in /var/www/vhosts/aaronadams.ca/sites/staging.aaronadams.ca/.git/

Finalmente, en nuestra máquina local, cambiaremos nuestro control remoto para reflejar la ubicación de nuestro nuevo repositorio y presionar.

[aaron@aaronadams]$ git remote set-url staging [email protected]:sites/staging.aaronadams.ca [aaron@aaronadams]$ git push staging master remote: Submodule ''codeigniter'' (git://github.com/EllisLab/CodeIgniter.git) registered for path ''codeigniter'' remote: Cloning into ''codeigniter''... remote: Submodule path ''codeigniter'': checked out ''fd24adf31255822d6aa9a5d2dce9010ad2ee4cf0'' To [email protected]:sites/staging.aaronadams.ca * [new branch] master -> master

Santa mierda, funcionó!

Este método no solo es compatible con los submódulos, sino que también requiere un solo comando para configurar un nuevo repositorio remoto (que, de acuerdo, consta de cuatro comandos). También mantiene el repositorio y el árbol de trabajo en el mismo lugar; y sin rutas absolutas requeridas en nuestra configuración o archivos gancho, ahora es completamente portátil también.

¡Espero que esta respuesta ayude a alguien tanto como las publicaciones de Intercambio de Apuestas de todos los demás me han ayudado en los últimos dos días!


Descubrí otra solución que me parece bastante limpia. Solo dale a git toda la información que necesita para realizar las cosas del submódulo:

$ cd /path/to/your/git_work_tree $ git --git-dir=/path/to/your/bare_repo.git --work-tree=. submodule init $ git --git-dir=/path/to/your/bare_repo.git --work-tree=. submodule update


Una posible forma podría ser:

  • para configurar /var/www/website como un repositorio (no al descubierto)
  • tener su gancho post-receive de su repositorio desnudo:
    • establezca GIT_DIR y GIT_WORK_TREE en el repositorio non-bare en /var/www/website
    • cd /var/ww/website
    • git pull ~/website
    • git submodule update (un poco como " ¿Cómo inicio / actualizo un submódulo de git en un árbol de trabajo después de empujarlo a un directorio de trabajo desnudo? ")

En otras palabras:
Extraiga del repositorio desnudo en lugar de tratar de pagar desde un repositorio simple: un repositorio no vacío debería poder acomodar el paso de git submodule update .

Un script de ejemplo puede parecerse

#!/bin/sh # Get the latest code cd /path/to/bare/repo git fetch # Set git variables GIT_WORK_TREE=/var/www/website GIT_DIR=/var/www/website/.git # Go to website and pull cd /var/www/website git pull /path/to/bare/repo git submodule update --init --recursive # Run additional build stuff here