この回答は現在、2台のLinuxコンピューター(またはMacでも動作する可能性がありますか?-Macでテストされていません)の使用にのみ適用されます(この同期スクリプトをbashで記述したため)。git
ただし、これは単にのラッパーです。したがって、必要に応じて、それをクロスプラットフォームのPythonソリューションまたは何かに変換してください。
これはOPの質問に直接答えることはありませんが、非常に近いので、このページにアクセスした他の多くの人々の質問にも答えることを保証します(実際には、自分自身の解決策を書く前にここに来たので、私も含まれています)。とにかくここに投稿しています。
したい:
- 軽量のLinuxコンピューターでEclipseのような強力なIDEを使用してコードを開発し、
- 別のより強力なLinuxコンピューター上でsshを介してそのコードをビルドします(Eclipse内からではなく、コマンドラインから)
コード「PC1」(パーソナルコンピューター1)を作成する最初のコンピューターと、コード「PC2」を作成する2番目のコンピューターを呼び出します。PC1からPC2に簡単に同期するツールが必要です。私はを試しましたがrsync
、大規模なリポジトリの場合は非常に遅く、大量の帯域幅とデータを消費しました。
それで、どうすればいいですか?どのワークフローを使用する必要がありますか?この質問もあるなら、ここに私が決めたワークフローがあります。git
githubなどのリモートリポジトリを介してPC1からPC2に変更を自動的にプッシュすることでプロセスを自動化するbashスクリプトを作成しました。これまでのところ、それは非常にうまく機能し、私は非常に満足しています。各PCが機能するgitリポジトリを維持し、全体の同期を実行するためにはるかに少ない帯域幅を使用するので、私よりもはるかに高速でrsync
信頼性が高く、大量のデータを使用せずに携帯電話のホットスポットで簡単に実行できます。
セットアップ:
PC1にスクリプトをインストールします(このソリューションは〜/ binが$ PATHにあると想定しています):
git clone https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.git
cd eRCaGuy_dotfiles/useful_scripts
mkdir -p ~/bin
ln -s "${PWD}/sync_git_repo_from_pc1_to_pc2.sh" ~/bin/sync_git_repo_from_pc1_to_pc2
cd ..
cp -i .sync_git_repo ~/.sync_git_repo
次に、上記でコピーした「〜/ .sync_git_repo」ファイルを編集し、ケースに合わせてパラメーターを更新します。含まれるパラメータは次のとおりです。
# The git repo root directory on PC2 where you are syncing your files TO; this dir must *already exist*
# and you must have *already `git clone`d* a copy of your git repo into it!
# - Do NOT use variables such as `$HOME`. Be explicit instead. This is because the variable expansion will
# happen on the local machine when what we need is the variable expansion from the remote machine. Being
# explicit instead just avoids this problem.
PC2_GIT_REPO_TARGET_DIR="/home/gabriel/dev/eRCaGuy_dotfiles" # explicitly type this out; don't use variables
PC2_SSH_USERNAME="my_username" # explicitly type this out; don't use variables
PC2_SSH_HOST="my_hostname" # explicitly type this out; don't use variables
PC1とPC2の両方で同期するリポジトリをGitで複製します。
- PC1とPC2の両方からリモートリポジトリにプッシュおよびプルできるように、sshキーがすべて設定されていることを確認します。ここにいくつかの役立つリンクがあります:
- https://help.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh
- https://help.github.com/en/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
- sshキーがすべてPC1からPC2へのsshに設定されていることを確認します。
今cd
PC1、および実行のGitリポジトリ内の任意のディレクトリに:
sync_git_repo_from_pc1_to_pc2
それでおしまい!約30秒後、すべてがPC1からPC2に魔法のように同期され、何が行われているのか、ディスク上でどのコンピューター上で行われているのかを伝えるために、常に出力が印刷されます。コミットされていないものを上書きまたは削除しないため、安全です。代わりに最初にバックアップします!仕組みについては、以下をご覧ください。
このスクリプトが使用するプロセスは次のとおりです(つまり、実際に何をしているのか)
- PC1から:コミットされていない変更がPC1にあるかどうかを確認します。もしそうなら、それはそれらを現在のブランチの一時的なコミットにコミットします。次に、それらをリモートのSYNCブランチに強制的にプッシュします。次に、ローカルブランチで行った一時的なコミットのコミットを解除し、スクリプトを呼び出したときに以前にステージングされたファイルをステージングすることにより、ローカルのgitリポジトリを元の状態に戻します。次に、
rsync
スクリプトのコピーをPC2にコピーし、ssh
PC2に特別なオプションを指定してスクリプトを実行するようにPC2に指示する呼び出しを実行します。
- PC2が行うことは次のとおりです。PC2は
cd
リポジトリに格納され、ローカルのコミットされていない変更が存在するかどうかを確認します。その場合は、現在のブランチから分岐した新しいバックアップブランチ(サンプル名:my_branch_SYNC_BAK_20200220-0028hrs-15sec
<-YYYYMMDD-HHMMhrs--SSsec)を作成し、などのコミットメッセージを使用して、コミットされていない変更をそのブランチにコミットします DO BACKUP OF ALL PC2(ターゲットPC /ビルドマシン)でのコミットされていない変更。これで、SYNCブランチがチェックアウトされ、ローカルマシンにまだない場合は、リモートリポジトリからプルされます。次に、リモートリポジトリの最新の変更をフェッチし、ハードリセットを実行して、ローカルのSYNCリポジトリをリモートのSYNCリポジトリに一致させます。これを「ハードプル」と呼ぶかもしれません。ただし、PC2でローカルに行ったコミットされていない変更はすべてバックアップ済みであるため、何も失われないので安全です。
- それでおしまい!これで、スクリプトがすべての自動コミットやその他の処理を行ったので、クリーンな作業ディレクトリを保証する必要なく、PC1からPC2への完全なコピーが作成されました。高速で、巨大なリポジトリで非常にうまく機能します。これで、リポジトリが数十ギガバイトで時間がある場合でも、必要に応じて携帯電話からWi-Fiホットスポットを介して、別のマシンでビルドまたはテストしながら、任意の IDEを1つのマシンで使用する簡単なメカニズムが手に入りました。およびリソースに制約があります。
リソース:
- プロジェクト全体:https : //github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles
- このプロジェクト内のソースコード自体に、さらに多くのリンクと参照が表示されます。
- 「ハードプル」と呼んでいる方法:「git pull」でローカルファイルを強制的に上書きするにはどうすればよいですか?
関連:
- 移動するときにコンピューター間でgitリポジトリを同期しますか?