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
yGIT_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? ")
- establezca
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