2

简短的:

hg clone 在 /.hg/hgrc 中创建路径“默认”,设置为您克隆的位置。

问:是否可以自动禁用此功能?

细节:

这已经部分回答了。

你能阻止默认推送,但允许拉取吗?我们看到如何设置默认推送,在一些 hgrc 文件中,例如 /.hg/hgrc,或者(我的偏好),在 ~/.hgrc

Is hg clone 是否等同于 hg (init→pull) Tim Henigan 说 hg clone = init; 拉; hg 更新默认值;在 /.hg/hgrc 中设置默认路径。

尽管在其他地方我们看到这并不完全正确。hg clone 可能不同,例如,它进行硬链接共享。缺乏官方的等效声明...

现在,禁用默认推送有很大帮助。

但是......我已经养成了做“hg push default”的习惯。这在某种程度上违背了目的。

顺便说一句:我这样做的原因是,想要禁用默认值:master->workspace->staging_area->master 的工作流。我做了很多大师的克隆。每次我做 cline 时修改 /.hg/hgrc 以编辑 [path] 默认值是一种痛苦。在任何工作区中执行“hg push”或“hg push default”都可能很糟糕。相反,我需要推送到暂存区,我只允许从暂存区推送到主服务器。

(我已经尝试过 master<->staging_area<->workspace,即总是从 sdtaging 区域克隆。但我发现这令人困惑。另外,我还没有说的部分:我的项目让我删除或折叠历史记录,这增加了额外的混乱和容易出错的程度。)

4

1 回答 1

0

这是我想出的克隆后挂钩:

 [hooks]
 post-clone = perl ~/bin/delete-default-from-.hgrc "$HG_PATS"

perl 脚本如下。

我还是想找一个单行。

#!/usr/local/bin/perl
use strict;

print "editing <repo>/.hg/hgrc to to remove [paths] / default";

# Hand tested
# cd ~/mips/uarch-perf-sim/psim+stuff/f; rm -rf k; hg clone ../m k
# cd ~/mips/uarch-perf-sim/psim+stuff/f; rm -rf k; hg clone ../m

my $debug = 0;


my $hg_pats = $ARGV[0];
die "Usage: delete-default-from-.hgrc HG_PATS (from post-clone hook)\n" if !exists $ARGV[0] || exists $ARGV[2];


# expect HG_PATS from post-clone hook

#['../m']
#['../m', 'target']"
#['../m', '../target']"

my $from;
my $target;

if( $hg_pats =~ m/^\['([^']+)'\]$/ ) {
    $from = $1;
    $target = $from;
    # delete paths if target implicit
    $target =~ s{.*/}{};
    print "from-only: $target\n" if $debug;
} elsif( $hg_pats =~ m/^\['([^']+)',\s+'([^']+)'\]$/ ) {
    $from = $1;
    $target = $2;
    # do NOT delete paths if target explicit
    print "from to: $target\n" if $debug;
} else {
    die "expected HG_PATS, got: $hg_pats\n";
}

die "clone target not found: $target\n" if ! -d $target;

my $hgrc = "$target/.hg/hgrc";
die "clone target/.hg/hgrc not found: $hgrc\n" if ! -r "$hgrc";

open( my $in, "<$hgrc" ) || die "could not open $hgrc to read (edit)\n";
unlink "$hgrc.tmp";
open( my $out, ">$hgrc.tmp" ) || die "could not open $hgrc.tmp to write\n";

my $section = '';
my $paths_found;
my $paths_default_found;
while( my $line = <$in> ) {
    chomp($line);
    print "line = $line\n" if $debug;

    if( $line =~ m/^\[paths\]/ ) {
    $section = "[paths]";
        $paths_found++;
    }
    elsif( $line =~ m/^\[/ ) {
    $section = $line;
    }
    elsif( ($section eq "[paths]") and ($line =~ m/^\s*default\s*=/) ) {
    $line =~ s/default/default-cloned-from/;
        $paths_default_found++;
    }
    print $out $line."\n";
}

die "[paths] section not found in $hgrc" if ! $paths_found;
die "[paths] / default not found in $hgrc" if ! $paths_default_found;

system("echo '<diff edited $hgrc>';diff -U10 $hgrc $hgrc.tmp; echo '</diff>'");


unlink "$hgrc.orig";
die "could not unlink older $hgrc.orig" if -e "$hgrc.orig";

rename "$hgrc","$hgrc.orig" || die "could not rename $hgrc to $hgrc.orig";

rename "$hgrc.tmp","$hgrc" || die "could not rename $hgrc.tmp to $hgrc";

system("echo '$hgrc:';cat $hgrc");

exit(0);
于 2012-06-23T22:56:58.390 回答