0

ソフトウェアの開発中に、を介して自動的に実行される一連のテストケースを作成しますmake tests。物事を整理するために、私はそれらをサブディレクトリに置きtestsます。コミットも整理し、開発ブランチを乱雑にしないためにtests、テストユニットをコミットする追加のブランチを作成しました。

私の問題は、ユニットをテストブランチにコミットして開発に戻すと、テストが削除されるということです。

D:\Project>hg branch test
D:\Project>edit...
D:\Project>hg add
D:\Project>hg commit
D:\Project>hg up dev
2 files updated, 0 files merged, 3 files removed, 0 files unresolved

これらのファイルを保存するにはどうすればよいですか?(私はMercurialのソリューションを試しました:変更を失うことなく作業ディレクトリをブランチに切り替えますか?それでもファイルを削除します)

編集以下の私自身の答えを参照してください

4

3 に答える 3

4

これらのテストファイルは開発ブランチに存在しないため、開発ブランチをチェックアウトすると、作業ディレクトリには存在しません。MercurialやgitなどのDVCSでは、あるリビジョン/ブランチで1つのディレクトリをチェックアウトし、別のリビジョン/ブランチで別のディレクトリをチェックアウトすることはできません。

あなたがリンクした答えは、変更されたファイルとそのファイルを別のブランチに持ち込むためのものであり、あなたが求めているものではありません。

したがって、あなたがそれをやりたい方法(別々のブランチ)は機能しませんが、他の/より良いオプションがたくさんあります

1つの選択肢は、テストをmq(Mercurial Queues)リポジトリによって管理されるパッチにすることです。このリポジトリ自体をバージョン管理できます。次に、開発ブランチのどこにいて、テストを実行したい場合は、次のようにします。

hg qpush # tests show up
... run tests, edit tests ..
hg qrefresh  # save the changes you made to the test
hg qpop  # tests vanish again

MQは強力ですが、頭を包み込むのが少し難しい場合があります。

もう1つの選択肢は、テストを親リポジトリにし、実際のコードをその親の子リポジトリにすることです。ディスクレイアウトは次のようになります。

parent/
   tests/
   existingrepo/   # <-- the repo you already have w/o tests

次に、クローンを作成して、テストなしで既存のリポジトリをプッシュできますが、外部リポジトリにはそれへのポインタが含まれ、2つはロックステップでバージョン管理されます。繰り返しますが、ちょっとトリッキーですが、いくつかの素晴らしい結果があります。

3番目のオプションであり、私の好みは、「コミットも整理された状態に保ち、開発ブランチを乱雑にしない」という考え方を克服することです。テストはプライマリコードと同じくらい重要であり、コードでバージョン管理する必要があります。テストは何も乱雑ではなく、コードが何をしているのかを理解するのに役立つ貴重なツールを提供します。hg log --exclude tests/都合の良いときに、いつでもそれらを除外した履歴を表示するために使用できます。

その思い切った行動を取るには、次のようにします。

hg update development
hg merge tests

そして、あなたは行ってもいいです。

于 2013-03-04T00:50:26.100 に答える
2

ユニットをテストブランチにコミットして開発に戻すと、テストは削除されます

期待される正しい結果:ブランチは分岐した開発ラインを格納します。テストブランチにのみadd何かがあり、マージする前は、このデータは作成時にブランチにのみ存在します。

「コミットも整理し、開発ブランチを乱雑にしないために...」、ただし開発ブランチでテストを行うには、少なくとも2つの方法を使用できます。

  • 定期的testsにブランチをにマージしdevelopmentます(テストのすべての変更は開発に表示されます)が、ログは開発ブランチの変更セットにのみ使用し、テストからのマージセットは使用しない場合があります。それはむしろ単純なrevsetであり、revsetを使用してlogコマンドをエイリアスに書き込み、必要に応じてエイリアスコマンドを使用することもできます。
  • Ry4anが述べているように、ブランチ分離の代わりに、subrepo |guestrepoテクニックを使用してリポジトリ分離を実行できます-テストがメインリポジトリのサブディレクトリに保存されている場合は、/ testsをネストされたリポジトリ->サブリポジトリに変換し、2つの独立したリンクされたリポジトリを持ちます(今後の読み物:MercurialwikiのサブリポジトリとMercurialキックスタート演習のサブリポジトリ)
于 2013-03-04T03:53:18.360 に答える
0

私が望んでいたことを達成するために、私は最終的にリポジトリのサブディレクトリを作成しました:

project/
  main.cpp
  makefile
  .repo/
    .hg/

新しいmakeターゲットを作成しました:

REPO := .repo

init: $(REPO) $(REPO)/.hg

$(REPO):
    mkdir -p $(REPO)

$(REPO)/.hg:
    hg init $(REPO)

commit : | $(REPO) $(REPO)/.hg
ifdef BRANCH
    hg -R $(REPO) update -C $(BRANCH)
endif
    find . -regex "^\./[^.].*" -exec cp --parents {} ./$(REPO) \;
# the regex prevents "hidden" dot-folder from copying
# one could use --link to save time and drive usage/space
# but i am concerned about hg auto merging and overriding (per hardlink)
# my actual changes
    hg -R $(REPO) commit $(EXTRA)

make commit BRANCH=testsしたがって、ブランチに関係のないすべての変更を失うことなく、任意のブランチにコミットするために発行することができます。hg addaswipe .repoの実装はcopy file there hg -R .repo add $(filename)、読者の演習として残されています

于 2013-03-07T11:42:18.010 に答える