假设我有一个具有 root 访问权限的本地工作站和一个没有 root 访问权限的服务器。我想在这两台计算机之间共享(主要是配置)文件。因此,我在我的主目录中设置了一个顶级的 git 存储库,并添加了这些文件。到目前为止,一切都很好。
进一步假设两台计算机上都存在我需要的文件。它带有包管理器,因此将安装在我的主目录之外。它没有安装在服务器上,也不会安装在服务器上。我现在有两个选择:
我在本地使用包管理器安装它,然后手动将其安装在远程服务器上。这样文件就不会同步。这有点没关系,因为该文件来自包管理器,所以它实际上并不是我正在处理的文件。然而,当我搬到新服务器时,我总是需要单独安装它,而且这种情况经常发生。不过,我可以添加一个用于安装软件包的 shell 脚本,并将该 shell 脚本添加到 git 存储库中。
我将其本地安装在我的主目录中并将其添加到存储库中。这样我就不必在不同的机器上单独安装它,它保持同步,但不再通过包管理器更新。这就是我现在正在做的事情。
问题是:是否有第三种更好的方法来做到这一点?有git
符号链接魔法吗?
答案1
根据您的描述,我认为您想在远程计算机上运行 shell 脚本。但也许设置一个 shell 脚本仅在本地计算机上运行,将包从本地包目录推送到本地 git 存储库会更方便。然后,您可以使用 cron 或更简洁的 git commit hook 来运行此脚本,以便始终保持同步。
[根据要求从评论移至回答]
答案2
我现在使用以下预推挂钩:
#!/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