Mercurial“hg status”和相对路径

时间:2009-05-07 07:36:48

标签: mercurial

我正在为不同的项目使用mercurial和git,并且喜欢它们。我觉得有点恼火的是,“hg status”显示了相对于存储库根目录的路径,而不是当前目录(与git不同)。可以通过某种方式调整这种行为吗?

5 个答案:

答案 0 :(得分:35)

要查看相对于当前目录的工作空间状态,您始终可以使用“。” (单点)作为“hg status”的参数,即:

% hg root                   # root of the workspace
/work/foo

% pwd                       # current directory is <root>/src
/work/foo/src

% hg status                 # no argument, see all files
M etc/foo.conf              # all files are shown with paths
M src/foosetup.c            # relative to workspace root
%

明确要求当前工作目录的区别在于相对文件名路径使用它作为起点:

% hg status .               # see only files under current path
M foosetup.c
%

答案 1 :(得分:32)

通常的解决方法是运行:

hg status $(hg root)

对于旧版本的Mercurial,在1.7之前,您可以使用此hack,添加到您的存储库的“.hg / hgrc”文件中:

[alias]
 sst = status /path/to/root

需要启用别名扩展,因此您可能需要在〜/ .hgrc文件中添加“alias =”。

从Mercurial 1.7开始,别名扩展了解了“!”转义为使用shell命令,因此您现在可以拥有执行此操作的全局别名:

[alias]
sst = !hg status $($HG root) $HG_ARGS

不要使用st = !hg status $(hg root),因为这会创建一个无限循环,一遍又一遍地运行hg状态。它看起来像是别名解析中的一个错误 - 如果你想让别名hg status显示来自根的路径,那么下面的咒语在全局$ HOME / .hgrc中起作用:

[alias]
__mystatus = status
st = !hg __mystatus $($HG root) $HG_ARGS

答案 2 :(得分:7)

自旧的mercurial版本(&gt; = 1.1 ,自2008年起)起作用的标准方式是:

hg status re:

产生:

M ../contrib/buildrpm
M ../hg
M httprepo.py

自mercurial 1.3 (2009)以来,您可以根据需要定义alias

[alias]
sst = status re:

此行为最终记录在 3.4 (2015):

$ hg help status --verbose
[...]
- show changes in the working directory relative to the current directory
  (see 'hg help patterns' for more information):

    hg status re:

由于mercurial 4.2 (2017年5月),您可以告诉status命令始终打印相对路径,将其放入hgrc

[commands]
status.relative = True

直接在命令行上测试(hg&gt; = 4.2):

$ hg --config commands.status.relative=True status
M ../contrib/buildrpm
M ../hg
M httprepo.py

最后,mercurial 4.3 引入了ui.tweakdefaults,除其他外,它将一些默认值更改为更现代的默认值:

[ui]
# hg status prints relative paths
# hg diff produces patches in git format
tweakdefaults = True

如果您使用现代的mercurial(&gt; = 4.3),这是官方推荐的方式。

答案 3 :(得分:2)

随着时间的推移,汞越来越好了: 使用hg 2.2.3,我可以定义st别名。

[alias]
st = !hg status $($HG root) $HG_ARGS

因此:

  • hg st将为您提供相对于当前目录的路径
  • hg status将为您提供相对于hg根目录的路径

答案 4 :(得分:2)

我添加这个答案不是因为它比接受的答案更好,而是因为它澄清了“hg status”之间的区别。和“hg status $(hg root)”。这可能会使一些评论者感到困惑 - 更糟糕的是,这可能导致忘记检查必要的东西。

“hg status。”仅使用相对路径报告下面子树的状态。

“hg status $(hg root)”使用相对于CWD的路径报告整个仓库的状态。

两者都很有用。

(一般来说,“hg status path”显示路径下的子树的状态(整个仓库,如果路径= $(hg root)“,但相对于CWD。(我必须承认我发现这令人困惑,因为那里发生了两件事:子树获取状态,而cwd显示相对于的路径。))

下面嵌入的shell会话示例显示了这一点。

$ bash [~/hack] 562 $> mcd hg-test
./hg-test
$ bash [~/hack/hg-test] 563 $> hg init .
$ bash [~/hack/hg-test] 564 $> mkdir subdir
$ bash [~/hack/hg-test] 565 $> touch foo
$ bash [~/hack/hg-test] 566 $> touch subdir/bar
$ bash [~/hack/hg-test] 567 $> hg status
? foo
? subdir/bar
$ bash [~/hack/hg-test] 552 $> hg status $(hg root)
? foo
? subdir/bar
$ bash [~/hack/hg-test] 552 $> cd subdir
./subdir
$ bash [~/hack/hg-test/subdir] 553 $> hg status
? foo
? subdir/bar
$ bash [~/hack/hg-test/subdir] 553 $> hg status .
? bar
$ bash [~/hack/hg-test/subdir] 513 $> hg status $(hg root)
? ../foo
? bar
$ bash [~/hack/hg-test/subdir] 523 $> hg status
? foo
? subdir/bar

因此,如果你想做一些事情,比如在本地子树中备份文件,而无需登记,然后恢复(我经常需要在使用“hg lock”时这样做,因为我使用的是不能使用的FrameMaker文件在hg(或几乎没有)内被分开或合并:)

$ bash [~/hack/hg-test/subdir] 523 $> mkdir bak; hg status -n . | xargs cp --target-directory bak
$ bash [~/hack/hg-test/subdir] 524 $> ls bak
bar

但是,如果要备份树中按状态

报告的所有文件
$ bash [~/hack/hg-test/subdir] 528 $> mkdir bak-root; hg status -n $(hg root) | xargs cp --target-directory bak-root
cp: will not overwrite just-created `bak-root/bar' with `bar'
$ bash [~/hack/hg-test/subdir] 529 $> ls bak-root
bar  foo

顺便说一下,警告显示了文件名冲突的问题。我通常使用一个小工具来添加.bak后缀或xargs。但这个例子就足够了。

顺便说一下^ 2,我通常用“hg status -nm”做这样的事情,但上面的例子就足够了。