待ち時間問題なくローカルディレクトリをリモートディレクトリと自動的に同期させるにはどうすればよいですか?

待ち時間問題なくローカルディレクトリをリモートディレクトリと自動的に同期させるにはどうすればよいですか?

私は多数のファイルを含むgitトレースストアを開発しました。このコードはリモートシステムで実行する必要があります。したがって、ローカルで変更を適用するたびに、それをリモートデバイスと同期させ、リモートコンピュータで新しいコードを実行する必要があります。

手動同期ステップを取り除きたいです。私が試したこと:

  • 単にgit push(ローカル)とgit pull(リモート)の操作を実行すると、うまくいきますが、役に立たないコミットがたくさんあります。また、時には実装したくない小さな変更を試してください。
  • リモートディレクトリをローカルにマウントするとsshfs機能しますが、ファイルアクセスに多少の遅延があります。構いませんが、PyCharmがこれに依存しており、多くの機能が破損しています。

これを達成するより良い方法はありますか?

答え1

結局、私は2つの解決策を見つけました。

  • 使用unison。これは、リモートサーバーのローカルディレクトリをミラーリングするためのコマンドラインユーティリティです。多くのファイルを扱うのと似ていますrsyncが、より複雑で人間工学的です。彼らgithubリポジトリ非常にアクティブですが、Webページにはほとんど開発が中断されていますが、主な欠点はunisonバックグラウンドで実行されるユーティリティではなく、一度だけ実行されるユーティリティです。cron定期的に実行するのと同じ機能を使用できますが、unisonこれにより長い同期遅延(1分以上)が発生し、手動の競合解決がどのように機能するのかわかりません。
  • 使用lsyncd。このプログラムは私のユースケースに合わせて設計されています。特定のディレクトリを継続的に監視し、すべての変更をわずか1秒ですぐに同期します。しかし、最後のコミットは2年前なので、長期的にどれだけ実行可能かは分かりません。

lsyncd引き続き実行されるので結局使用するようになりました。場合は、どのディレクトリをどこでどのように同期するか(たとえば、特定のファイルを無視するかどうか)をlsyncd示すLuaファイルである「設定ファイル」を提供する必要があります。lsyncd次の設定ファイルを使用しました。

settings {
    nodaemon = true,
    statusInterval = 1
}

sync {
    default.rsync,
    source = "/home/donentolon/github/my-awesome-codebase",
    target = "remote-machine:/home/remote-user/my-awesome-codebase",
    delay = 1, 
    exclude = { '/.git', '/.idea' }
}

これはlsyncd私たちに次のことを伝えます。

  • SSHを使用してリモートシステムに接続します(接続するconfigようにSSHを設定しました)。ssh remote-machine
  • 実際の同期に rsync を使用する
  • 少なくとも1秒間に1回、ファイルの変更を確認してください(delay)。
  • トップレベルのgitファイルとPyCharmファイルを同期しない

コンピュータの電源を入れたときに端末を開いて実行すると、実行が開始され、lsyncd my-lsyncd-profile.lua現在実行中のタスクのリアルタイム更新が印刷されます。私は端末を開いたままにして、lsyncd一日の終わりに仕事を開発して完了します。

私はリモートディレクトリの変更を追跡するためにgitを使用しません。 gitに変更をコミットするには、git commitローカルコンピュータでlsyncd同期する別のコマンドを実行します。~から。ローカルディレクトリは実際にはローカルディレクトリであり、ローカルにインストールされたリモートディレクトリではないため、インデックス作成などのPyCharm機能は正常に機能します。

バックグラウンドモードがありますが、ステータスチェックが好きなので使用しませんlsyncd。標準のLinuxメソッドを使用して自動的に起動するように設定できますが、私は手動の方法を好みます。

lsyncdこのページには同様のユースケースのいくつかの選択肢がリストされているため、このソリューションが気に入らない場合は、そのソリューションを確認できます。

答え2

あなたは試すことができますsyncthing。よくサポートされ、よく発達したようです。これまでアスタリスク48,900個、コミット7009個、貢献者284人がいます。

初めて知ったところは次のとおりです。https://hackaday.com/2020/07/23/linux-fu-keep-in-sync/


私は独自の連続同期ツールを開発しています。このツールgsyncは現在非同期であり、手動で呼び出されるスクリプトです。sync_git_repo_from_pc1_to_pc2.sh。ここで私のデザインノートのいくつかを読むことができますgsynchttps://github.com/ElectricRCAaircraftGuy/eRCaGuy_dotfiles/issues/24

答え3

このユースケースは実際には非常に一般的です(特に組み込み開発では)。前述のように、ローカルコンピュータにアプリケーションを実行するための正しい環境がない場合があります。

ほとんどのIDEには「リモート実行」機能がありますが、私はPyCharmを使った経験がありません。バラよりここ特にPyCharm用です。

環境に拘束されないもう1つのアプローチは、ファイルを使用するか、scp転送rsync/同期してからリモートで実行することです。

これが正しく機能するには、ホストからターゲットとしてSSH公開鍵認証を構成する必要があります。ssh-copy-id user@target

その後、このようなスクリプトを使用してフォルダをリモートで転送できます。転送が成功したら、いくつかのコマンドを実行します。

#!/bin/bash

TARGET="<your-remote-here>";
USER="<your-user-name-on-remote-here>";
FOLDER_TO_TRANSMIT="<folder-to-transmit>";
FOLDER_TO_TRANSMIT_TO="<folder-path-on-target>";
REMOTE_COMMANDS="touch ~/testdir/z; ls ~/testdir;"

#transmit only (inefficiant, transmits everything, every time)
#scp -r $dir_to_transmit $USER@$TARGET:$FOLDER_TO_TRANSMIT_TO;
rsync -rv --delete $dir_to_transmit $USER@$TARGET:$FOLDER_TO_TRANSMIT_TO

if [ $? -eq 0 ]
then
    ssh -t $USER@$TARGET "$REMOTE_COMMANDS"
fi

この設定で心配する唯一のことは、毎回転送するフォルダを適切に整理することです。 (rsync:--deleteソースフォルダに存在しないすべてのアイテムはターゲットフォルダからも削除されます。これは除外モードで回避できます。)(scp:該当する場合は、必要に応じてリモートフォルダ全体を削除できます)

設定がもう少し複雑な場合は、毎回送信するスクリプトを作成してからそのスクリプトを呼び出すこともできます。

関連情報