簡単に:
DVCSの分散リポジトリクローンに未保存の作業がないことをどのように確認しますか?
これは特にMercurialについて考えていますが、git、bzrなどにも当てはまります。
詳細:
古き良き時代には、CVSコマンドを覚えていない可能性があるため、-pseudocodeと同等の処理を実行する可能性のあるcronジョブを実行していました。
find all checked out CVS trees
do a cvs status command (which I think is something like cvs update -n?)
| grep '^M' to find all modified files not yet committed to the central repo
(最近は、(1)CVSを使用していたため、(2)時々私が訴えを担当していたため、何も失われませんでした。OK、最後はそれほど悪くはありませんでしたが、潰瘍がありました。)
Q:Mercurialのような最新のDVCSシステムと同等の方法を実行するにはどうすればよいですか。簡単だと思いましたが、よく調べてみると、欠けている部分があります。
私は次のようなことから始めました
find all ...path/.hg directories, and then look at ...path
do hg status - look at the output // this is easy enough
do hg outgoing // this is where it gets interesting
あなたは、hg発信を行うことで十分であると思うかもしれません。しかし、必ずしもそうとは限りません。
検討:
cd workspace-area
hg clone master repo1
hg clone repo1 repo2
rm -rf repo1
hg clone repo2 repo1
現在、repo1のデフォルトパスはrepo2であり、その逆も同様です。
もちろん、適切なワークフローがあれば、これは起こりません。自分の上流にあるものからのみクローンを作成する場合は、ピアからは作成しないでください。しかし...軽量のクローン作成は、DVCSを実行する理由の一部です。さらに、それはすでに私に起こっています。
この問題を処理するために、私は通常、どこかにhgパスを設定し、〜/ .hgrcで設定し、プロジェクトマスターURLに設定します。これは問題なく機能します-その1つのプロジェクトでは。多くのプロジェクトがある場合は、それほど問題はありません。それらをproject1-masterproject2-masterなどと呼んでも、たくさんあることになります。プロジェクト間で共有したいライブラリのためにサブリポジトリが急増している場合はさらに悪化します。
また、これはユーザーの.hgrcに含まれている必要があります。またはサイト.hgrc。その.hgrcを設定していない可能性のある人(システム上の数十(または数百)のプロジェクトのそれぞれの詳細を知らない管理者など)にとってはあまり良くありませんが、それでもユーザーをやりたいと思っています古い仕事を見つけることの好意。(彼らはそれを期待するようになったかもしれません。)または、これを行う方法について標準的な指示を単に与えたい場合。
プロジェクトの標準マスターリポジトリ(またはリスト)の名前をテキストファイルに入れて、リポジトリにチェックインすることを検討しました。repo/.hg_master_reposと言います。いくつかの問題はありますが、これは機能するように見えます(追加のローカルプロジェクトマスターではなく、グローバルプロジェクトマスターのみが表示される場合があります。それ以上の説明はしたくありません)。
しかし...私がこれを行う前に、これを行うための標準的な方法はありますか?
ちなみに、これが私がこれまでに持っているものです:
#!/usr/bin/perl
use strict;
# check to see if there is any unsaved stuff in the hg repo(s) on the command line
# -> hg status, looking for Ms, etc.
# for now, just send it all to stdout, let the user sort it out
# -> hg outgoing
# issue: who to check outgoing wrt to?
# generic
# a) hg outgoing
# but note that I often make default-push disabled
# also, may not point anywhere useful, e.g
# hg clone master r1
# hg clone r1 r2
# rm -rf r1
# hg clone r2 r1`
# plus, repos that are not clones, masters...
# b) hg outgoing default-push
# c) hg outgoing default
# various repos specific to me or my company
foreach my $a ( @ARGV ) {
print "********** $a\n";
$a =~ s|/\.hg$||;
if( ! -e "$a/.hg" ) {
print STDERR "Warning: $a/.hg dos not exist, probably not a Mercurial repository\n";
}
else {
foreach my $cmd (
"hg status",
# generic
"hg outgoing",
"hg outgoing default-push",
"hg outgoing default",
# specific
"hg outgoing PROJECT1-MASTER",
"hg outgoing MY-LOCAL-PROJECT1-MASTER",
"hg outgoing PROJECT2-MASTER",
# maybe go through all paths?
# maybe have a file that contains some sort of reference master?
)
{
my $cmd_args = "$cmd -R $a";
print "======= $cmd_args\n";
system($cmd_args);
}
}
}
ご覧のとおり、私はそれが得たものを解析するために何も飾っていません-ユーザー、私、それを目で見てもらうだけです。
しかし、ただやって
find ~ -name '*.hg' | xargs ~/bin/hg-any-unsaved-stuff.pl
私が知らなかった不審な未保存のものをたくさん見つけました。
hgステータスによって報告された古い未保存の変更は非常に疑わしいものです。発信によって報告されたプッシュされていない作業は疑わしいですが、クローンがブランチであると考える人にとってはおそらくそれほど悪くはありません。しかし、私は分岐したクローンを永遠に存続させるのではなく、誰かが1つの場所からクローンを作成することですべての履歴を見ることができるように、ブランチに物事を置くことを好みます。
ボトムライン:
上記の種類のサイクルに対して脆弱ではない、保存されていない作業、チェックインされていない、および/またはプッシュされていない作業を見つける標準的な方法はありますか?
「真の」プロジェクトマスターリポジトリをファイルのどこかに記録するための規則はありますか?
うーん...プッシュとクローンのワンドチェックインに関連するリポジトリがどこかに記録されていれば、適切なプロジェクトマスターが何であるかを推測できると思います。