
Supongamos que tengo una estación de trabajo local con acceso root y un servidor sin acceso root. Quiero compartir archivos (principalmente de configuración) entre estas dos computadoras. Así que configuro un repositorio git con nivel superior en mi directorio de inicio y agrego estos archivos. Hasta ahora, todo bien.
Supongamos además que existe un archivo que necesito en ambas computadoras. Viene con el administrador de paquetes y, como tal, se instalará fuera de mi directorio personal. No está instalado en el servidor y no se instalará en el servidor. Ahora tengo dos opciones:
Lo instalo con el administrador de paquetes localmente y lo instalo en el servidor remoto a mano. De esta manera los archivos no están sincronizados. Eso está bastante bien, ya que el archivo proviene del administrador de paquetes, en realidad no es un archivo en el que estoy trabajando. Sin embargo, siempre necesito instalarlo por separado cuando me mudo a un nuevo servidor, y esto sucede con frecuencia. Sin embargo, podría agregar un script de shell que instale el paquete y agregar este script de shell al repositorio de git.
Lo instalo localmente en mi directorio de inicio y lo agrego al repositorio. De esta manera no tengo que instalarlo por separado en diferentes máquinas, se mantiene sincronizado, pero ya no se actualiza a través del administrador de paquetes. Eso es lo que estoy haciendo ahora mismo.
Y aquí está la pregunta: ¿Existe una tercera (mejor) forma de hacer esto? ¿Algún git
vínculo simbólico mágico?
Respuesta1
Por su descripción, deduje que quería ejecutar el script de shell en la máquina remota. Pero tal vez sería más conveniente configurar un script de shell para que se ejecute solo en su máquina local, enviando el paquete desde su directorio de paquetes local a su repositorio de git local. Luego podrías usar cron o, mejor aún, un gancho de confirmación de git para ejecutar este script y estar siempre sincronizado.
[Movido del comentario a respuesta a pedido]
Respuesta2
Estoy usando el siguiente gancho de preempuje ahora:
#!/usr/bin/env bash
# Copy local files that are outside the repository (because they are controlled
# by the package manager) into the repository and commit them
# Although this is a pre-push hook, the files are not included in this push
# See also: http://unix.stackexchange.com/q/321328/58056
#remote="$1"
#url="$2"
localFiles=(
/usr/bin/rg
/usr/share/man/man1/rg.1.gz
/usr/share/vim/vimfiles/autoload/pathogen.vim
)
remoteFiles=(
/home/foo/pkg/bin/rg
/home/foo/pkg/man/man1/rg.1
/home/foo/.vim/autoload/pathogen.vim
)
echo "Execute git pre-push hook"
for idx in "${!localFiles[@]}"; do
localFile="${localFiles[$idx]}"
remoteFile="${remoteFiles[$idx]}"
echo -n "Copy ${localFile} to ${remoteFile}... "
cp "${localFile}" "${remoteFile}"
echo "Done."
echo -n "Add ${remoteFile} to repository... "
git add -f "${remoteFile}"
echo "Done."
done
echo "Commit if there is anything to commit... "
git commit -m "Automatically add files by git pre-push hook" \
&& echo -n "Some files were added and commited (but not pushed) " \
&& echo "by the git pre-push hook"
# Don't interfere with the push, so always exit with success
exit 0