ルートアクセスのあるローカルワークステーションとルートアクセスのないサーバーがあると仮定します。これら2台のコンピューター間で(主に構成)ファイルを共有したいと思います。そこで、ホームディレクトリにトップレベルのgitリポジトリを設定し、これらのファイルを追加します。ここまでは順調ですね。
さらに、両方のコンピューターに必要なファイルが存在するとします。パッケージマネージャーが付属しているので、ホームディレクトリの外にインストールされます。サーバーにインストールされておらず、サーバーにもインストールされません。現在、2つのオプションがあります。
パッケージマネージャーを使用してローカルにインストールし、リモートサーバーに手動でインストールします。このように、ファイルは同期されていません。ファイルはパッケージマネージャーからのものであるため、実際には私が作業しているファイルではありません。ただし、新しいサーバーに移動するときは常に個別にインストールする必要があり、これは頻繁に発生します。ただし、パッケージをインストールするシェルスクリプトを追加し、このシェルスクリプトをgitリポジトリに追加することはできます。
ホームディレクトリにローカルにインストールして、リポジトリに追加します。このように、別のマシンに個別にインストールする必要はありません。同期は維持されますが、パッケージマネージャーを介して更新されることはありません。それが私が今していることです。
そして、ここに質問があります:これを行う方法の3番目の-より良い-方法はありますか? git
シンボリックリンクマジックはありますか?
あなたの説明から、私はあなたがリモートマシンでシェルスクリプトを実行したいと思ったと思いました。ただし、ローカルマシン上でのみ実行するようにシェルスクリプトを設定し、パッケージをローカルのpackage-directoryからローカルのgitリポジトリにプッシュする方が便利な場合があります。次に、cronを使用するか、さらにはgit commitフックを使用してこのスクリプトを実行し、常に同期するようにします。
[コメントからリクエストに応じて回答に移動]
現在、次のプレプッシュフックを使用しています。
#!/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