Добавить файл вне репозитория git

Добавить файл вне репозитория git

Предположим, у меня есть локальная рабочая станция с правами root и сервер без прав root. Я хочу поделиться файлами (в основном конфигурационными) между этими двумя компьютерами. Поэтому я настроил репозиторий git с верхним уровнем в своем домашнем каталоге и добавил эти файлы. Пока все хорошо.

Далее предположим, что на обоих компьютерах есть файл, который мне нужен. Он поставляется с менеджером пакетов и, как таковой, будет установлен вне моего домашнего каталога. Он не установлен на сервере и не будет установлен на сервере. Теперь у меня есть два варианта:

  1. Я устанавливаю его локально с помощью менеджера пакетов и вручную устанавливаю на удаленном сервере. Таким образом, файлы не синхронизируются. Это в некоторой степени нормально, поскольку файл поступает из менеджера пакетов, это не совсем тот файл, над которым я работаю. Однако мне всегда нужно устанавливать его отдельно при переходе на новый сервер, и это часто случается. Я мог бы добавить скрипт оболочки, который устанавливает пакет, и добавить этот скрипт оболочки в репозиторий git.

  2. Я устанавливаю его локально в свой домашний каталог и добавляю в репозиторий. Таким образом, мне не нужно устанавливать его отдельно на разных машинах, он синхронизируется, но больше не обновляется через менеджер пакетов. Это то, что я делаю прямо сейчас.

И вот вопрос: есть ли третий - лучший - способ сделать это? Какая-нибудь 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

Связанный контент