Git の現在のブランチをリモートで追跡する
-
21-09-2019 - |
質問
継続的なテストを専用サーバーに移動しています (自動テストにより、ローカル ラップトップの速度が低下しすぎます)。私が望んでいるのは、テスト サーバー (たまたま CruiseControl.rb を実行している) が最新の (コミットされた) 変更を Git 経由で継続的に取得できるようにすることです。理想的には、自分のワークフローを変更する必要はありません。このプロジェクトに取り組んでいる開発者は私だけです。
テストサーバーを入手する前に、私は次のことを行っていました。
- 私のメイン開発システムとしてのラップトップ
- ローカル リポジトリ内の複数のブランチ。
- ブランチの 1 つを指すローカルの作業コピー。私はブランチを頻繁に切り替えます (通常は新機能のため)。
- GitHub アカウント。ローカル ブランチをミラーリングされたリモート ブランチに頻繁にプッシュします。(これは主にオフサイトのバックアップを使用するためのものです。現在のプロジェクトのコードは共有しません)。私は忘れることもありますが、少なくとも勤務日の終わりには GitHub にプッシュするようにしています。
それをすべてそのままにしておきたいと思います。それに加えて、現在は次のものを持っています。
- テストサーバー
- ...CruiseControl.rb を実行しています
- テスト サーバー上のラップトップ リポジトリのクローン。(現在は GitHub のクローンを作成していません)
- テスト サーバー上のローカルの作業コピー。CC はそこからビルド/テストを行います。
- この作業コピーは、(もちろん) 1 つの特定の Git ブランチを指します。
私はラップトップの作業コピーで作業しているブランチをテストサーバーに自動的に取得させ、そこからビルドするようにしようとしています。(これにより、システム リソースを消費することなく、autotest の継続的なテストが模倣されます)。
私が試しても成功しなかったこと:
- git checkout 起点/HEAD:これによりファイルは正常に取得されますが、「ブランチレス」作業コピーが気に入らないため、CruiseControl が機能しなくなります。
- git checkout --track -b a_branch 起点/a_branch:これはファイルの取得には問題なく機能し、CC も気に入っていますが、テスト サーバーが特定のブランチに固定されてしまいます。ラップトップでブランチを切り替えると、現在の作業のテストを実質的に停止します。
- git checkout --track -b my_testing_branch 起点/HEAD:これもビルド可能なファイルを取得しますが、上記のコマンドと同じ問題が発生します。Origin/HEAD からブランチを作成すると、「デフォルト」ブランチの HEAD のみが取得されるため、これもスティッキーです。
ワークフローに大きな変更を加えずに、(git ブランチの有無にかかわらず) 優れたリモート継続テスト システムを入手する方法はありますか?
解決
別のオプションを書く フック ることを通知し、試験サーバーの新しいコードを引きます。特に、 post-commit
フックがあります。そして、時にコミットを通知することができる試験サーバーの引き上げる。
他のヒント
現在のブランチの作業をマージする専用のテスト ブランチを作成できます。
そのブランチのコンテンツを現在の作業ブランチのコミットに強制的に置き換えることができます (「 git merge - は私たちのものですが、「彼ら」はどうでしょうか 質問)。
次に、CI サーバー上で次のように初期化します。
$ git fetch laptopRepo
$ git checkout -b testingBranch laptopRepo/testingBranch
これは、ラップトップ側で現在の作業をテストするために公開するという最初のステップを意味します。
これは最大の解決策ではないですが、それの何か...
テストサーバーは、あなたのラップトップ上で現在アクティブなブランチを参照するgit remote show origin
を実行することができます。例えば、
$ git remote show origin * remote origin Fetch URL: blade:/var/scratch/code Push URL: blade:/var/scratch/code HEAD branch: foo Remote branches: foo tracked bar tracked qux tracked
だから、原点リポジトリはfoo
枝の上に現在ある。
私が直接あなたがこの(おそらく誰かがより良い方法を持っています)から、それを解析する必要があること、あなたを与える低レベルのコマンドを見ていません。たとえば、
$ b=$(git remote show origin | grep "HEAD branch" | awk -F: '{print $2}') $ echo $b foo
さて、origin/foo
ので、(ローカルブランチ)をorigin/HEAD
に似て行動しないだろうし、あなたCruiseControlのは、そのようにあなたは、おそらく試験機上のローカルブランチを作成する必要がありますし、単純に、最新の場所にハードリセットされません。
$ b=$(git remote show origin | grep "HEAD branch" | awk -F: '{print $2}') $ git reset --hard origin/$b
HEAD
は、私は常にあなたがそれだと思うものにならないので、注、これは少し壊れやすいです。例えば、リベースのHEAD
中に前後に移動されます。テストサーバーのチェックがリベース中にあなたのラップトップ上HEAD
場合、それはいくつかの無効なまたは望ましくない場所を得ることができます。
私は、2つのシステム間の関係を反転させてかなり良いソリューションを引いてしまったのだと思いました。代わりにラップトップのリポジトリからテストサーバープルを有するので、私はラップトップのプッシュをテストするサーバーに出変わる可能性があります。
まず、私のラップトップのレポにリモートを追加します:
git remote add testing <url of testing server>
私はテスト用のコードを持っている時はいつでもそこで、私はプッシュを行います:
git push -f testing HEAD:master
これは私が上で、現在てるものは何でもブランチから動作します。私はそのブランチに既にあるものは何でも吹き飛ばすだろうと-f性を保証。私は、任意の祖先を心配する必要はありません。
これは実際に作業コピーに最新のコードを入れていないだろうが、CruiseControlののポーリングはそれを解決することができます。私も、<全角>作業コピーを更新し、サーバー側のフックを持っている可能性があり、が(私もその時点でCCを必要としない)テストスイートを実行します。
私はおそらく、スクリプトやエイリアスに+ pushコマンドをコミット組み合わせを追加することをお勧めします。それは私に私の一コマンドがコミット&テストを行います。何らかの理由で私がやりたいなら、私はあまりにもそれらのオプションを持って、テストプッシュ(またはその逆)することなく、コミットます。
ホストGitHubその利用 ポストを受けフック.このようなサービス Devver や RunCodeRun います。
私は過去にgitをスキップみなされ、共有フォルダ/ NFS / rsyncのソリューションに行くが、それは一つの大きな問題がありました:私は壊れた偽陽性のビルドになってしまいますので、それは、で/コミットに限定トリガーいません私は何かを入力の途中にいるよながら。