在 git 存储库之外添加文件

在 git 存储库之外添加文件

假设我有一个具有 root 访问权限的本地工作站和一个没有 root 访问权限的服务器。我想在这两台计算机之间共享(主要是配置)文件。因此,我在我的主目录中设置了一个顶级的 git 存储库,并添加了这些文件。到目前为止,一切都很好。

进一步假设两台计算机上都存在我需要的文件。它带有包管理器,因此将安装在我的主目录之外。它没有安装在服务器上,也不会安装在服务器上。我现在有两个选择:

  1. 我在本地使用包管理器安装它,然后手动将其安装在远程服务器上。这样文件就不会同步。这有点没关系,因为该文件来自包管理器,所以它实际上并不是我正在处理的文件。然而,当我搬到新服务器时,我总是需要单独安装它,而且这种情况经常发生。不过,我可以添加一个用于安装软件包的 shell 脚本,并将该 shell 脚本添加到 git 存储库中。

  2. 我将其本地安装在我的主目录中并将其添加到存储库中。这样我就不必在不同的机器上单独安装它,它保持同步,但不再通过包管理器更新。这就是我现在正在做的事情。

问题是:是否有第三种更好的方法来做到这一点?有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

相关内容