
Suponha que eu tenha uma estação de trabalho local com acesso root e um servidor sem acesso root. Quero compartilhar arquivos (principalmente de configuração) entre esses dois computadores. Então eu configurei um repositório git de nível superior em meu diretório pessoal e adicionei esses arquivos. Até agora tudo bem.
Suponha ainda que existe um arquivo necessário em ambos os computadores. Ele vem com o gerenciador de pacotes e, como tal, será instalado fora do meu diretório pessoal. Ele não está instalado no servidor e não será instalado no servidor. Agora tenho duas opções:
Eu instalo-o com o gerenciador de pacotes localmente e instalo-o manualmente no servidor remoto. Dessa forma, os arquivos não ficam sincronizados. Tudo bem, já que o arquivo vem do gerenciador de pacotes, não é realmente um arquivo no qual estou trabalhando. No entanto, sempre preciso instalá-lo separadamente ao mudar para um novo servidor, e isso acontece com frequência. Eu poderia adicionar um script de shell que instala o pacote e adicionar esse script de shell ao repositório git.
Eu o instalo localmente em meu diretório inicial e o adiciono ao repositório. Dessa forma não preciso instalá-lo separadamente em máquinas diferentes, ele fica sincronizado, mas não é mais atualizado pelo gerenciador de pacotes. Isso é o que estou fazendo agora.
E aqui está a questão: existe uma terceira maneira – melhor – de fazer isso? alguma git
mágica de link simbólico?
Responder1
Pela sua descrição, concluí que você deseja executar o script Shell na máquina remota. Mas talvez fosse mais conveniente configurar um script de shell para ser executado apenas em sua máquina local, enviando o pacote do diretório de pacotes local para o repositório git local. Então você poderia usar o cron ou, melhor ainda, um gancho de commit do git, para executar esse script para que você esteja sempre sincronizado.
[Movido de comentário para resposta mediante solicitação]
Responder2
Estou usando o seguinte gancho pré-empurrado agora:
#!/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