Producción, puesta en escena, sitios web Dev y repository git en el mismo server: cómo configurar GIT_DIR y GIT_WORK_TREE

He leído una serie de publicaciones que parecen acercarme pero no todo lo que me gustaría. Tengo un server. En él, tengo 3 sitios web: www.domain.com, stage.domain.com y dev.domain.com. También desarrollo en local.domain.com y también uso GitHub como mi repository central.

Me gustaría mantener mis repositorys git fuera de mis raíces web. Estoy abierto a cómo hacer esto. Lo que estoy intentando es:

/home/user/git/production.git /home/user/git/staging.git /home/user/git/development.git 

Sé cómo hacer esto si solo hay 1 sitio y repository configurando GIT_DIR y GIT_WORK_TREE (exporto las routes en .bash_profile).

Parece que puedo configurar el tree de trabajo dentro de la config cada repository, como:

 [core] bare = false worktree = /home/user/domains/www.domain.com/public_html 

¿Pero cómo configuro GIT_DIR ?

Entonces, si estoy en / home / user / domains / www .domain.com / public_html y hago un git status , etc., se está refiriendo al repository de producción git. Y si estoy en / home / user / domains / staging .domain.com / public_html, está vinculado a la etapa .git.

En lugar de establecer $GIT_DIR , podría usar files gitlink. Para hacer esto simplemente ingrese a la raíz de cada tree de trabajo y ejecute:

 echo "gitdir: /home/user/git/production.git" > .git 

Esto daría como resultado un file .git en su raíz web, pero lo único que se filtraría si alguien accede a eso sería la ruta al repository. Esto evitaría tener que jugar con la configuration de la variable $GIT_DIR function del directory en el que se encuentre.

¿Que estás tratando de hacer?

Cuando /home/user/git/production.git en su /home/user/git/production.git debería detectar el directory de trabajo como /home/user/domains/www.domain.com/public.html y push / pull / checkout debería funcionar bien allí. Desafortunadamente, git no es psíquico: desde un directory aleatorio sin una carpeta .git git ni siquiera sabe dónde search un file de configuration (sin un file "gitdir" , como acabo de aprender de la otra respuesta).

Siempre puedes pasar git --git-dir=~git/production.git checkout ... y demás, pero apuesto a que estás buscando una solución automatizada.

Tal vez intente envolver git en un script de shell? ¿Qué pasa si pones esto como ~/bin/autogit :

 #!/bin/bash DIR=$(pwd) if (fgrep -q domains/www.domain.com <<< "$DIR"); then git --git-dir=/home/user/git/production.git $@ elif (fgrep -q domains/staging.domain.com <<< "$DIR"); then git --git-dir=/home/user/git/staging.git $@ elif (fgrep -q domains/local.domain.com <<< "$DIR"); then git --git-dir=/home/user/git/development.git $@ fi echo "Autogit failed from directory $DIR." exit 1 

(Nota al margen: ¿por qué tiene tres repos? He descubierto que es más común tener un repository con tres nombres de sucursales diferentes, y un script que verifica cada twig en su directory apropiado).