
Предположим, у меня есть локальная рабочая станция с правами root и сервер без прав root. Я хочу поделиться файлами (в основном конфигурационными) между этими двумя компьютерами. Поэтому я настроил репозиторий git с верхним уровнем в своем домашнем каталоге и добавил эти файлы. Пока все хорошо.
Далее предположим, что на обоих компьютерах есть файл, который мне нужен. Он поставляется с менеджером пакетов и, как таковой, будет установлен вне моего домашнего каталога. Он не установлен на сервере и не будет установлен на сервере. Теперь у меня есть два варианта:
Я устанавливаю его локально с помощью менеджера пакетов и вручную устанавливаю на удаленном сервере. Таким образом, файлы не синхронизируются. Это в некоторой степени нормально, поскольку файл поступает из менеджера пакетов, это не совсем тот файл, над которым я работаю. Однако мне всегда нужно устанавливать его отдельно при переходе на новый сервер, и это часто случается. Я мог бы добавить скрипт оболочки, который устанавливает пакет, и добавить этот скрипт оболочки в репозиторий git.
Я устанавливаю его локально в свой домашний каталог и добавляю в репозиторий. Таким образом, мне не нужно устанавливать его отдельно на разных машинах, он синхронизируется, но больше не обновляется через менеджер пакетов. Это то, что я делаю прямо сейчас.
И вот вопрос: есть ли третий - лучший - способ сделать это? Какая-нибудь git
магия символических ссылок?
решение1
Из вашего описания я понял, что вы хотите запустить скрипт оболочки на удаленной машине. Но, возможно, будет удобнее настроить скрипт оболочки для запуска только на вашей локальной машине, переместив пакет из вашего локального package-directory в ваш локальный git-репозиторий. Затем вы можете использовать cron или, что еще лучше, git commit hook, чтобы запустить этот скрипт, чтобы вы всегда были синхронизированы.
[Перемещено из комментария в ответ по запросу]
решение2
Сейчас я использую следующий pre-push-хук:
#!/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