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