我正在为不同的项目使用mercurial和git,并且喜欢它们。我觉得有点恼火的是,“hg status”显示了相对于存储库根目录的路径,而不是当前目录(与git不同)。可以通过某种方式调整这种行为吗?
答案 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)
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”做这样的事情,但上面的例子就足够了。