简短的:
您如何确保任何 DVCS 的分布式存储库克隆中没有未保存的工作?
我正在专门为 Mercurial 考虑这一点,但它也适用于 git、bzr 等。
细节:
回到糟糕的过去,我曾经运行可能会执行相当于 - 伪代码的 cron 作业,因为我可能不记得 CVS 命令:
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)因为有时我是负责制作 sue 的人,没有丢失任何东西。好吧,那最后不是那么糟糕,但正在溃烂。)
问:对于像 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。这很好用 - 对于那个项目。如果你有很多很多项目,那就不太好了。即使您称它们为 project1-master project2-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 status 报告的未保存的旧更改非常可疑。传出报告的未推动工作是可疑的,但对于认为克隆是分支的人来说,这可能不是那么糟糕。但是,我不希望有一个分叉的克隆永远存在,而是将事物放在分支上,以便有人可以通过从一个地方克隆来查看所有历史。
底线:
是否有一种标准方法可以找到未保存的工作、未签入和/或未推送的工作,这种方法不易受到我上面提到的各种周期的影响?
在某处的文件中记录“真实”项目主存储库是否有一些约定?
嗯...我想如果在某处记录了推送和克隆魔杖签入所涉及的存储库,我可以猜测正确的项目大师可能是什么。