Я использую как mercurial, так и git для разных проектов и люблю их обоих. То, что я нахожу немного раздражающим в отношении меркуриала, заключается в том, что "статус hg" показывает пути относительно корня репозитория, а не текущего каталога (в отличие от git). Может ли это поведение каким-то образом изменить?
Меркуриальный статус "hg" и относительные пути
Ответ 1
Обычным обходным путем является запуск:
hg status $(hg root)
Для более старых версий Mercurial, до 1.7, вы можете использовать этот хак, добавив в файл своего репозитория ".hg/hgrc":
[alias]
sst = status /path/to/root
Для этого требуется расширение псевдонимов, поэтому вам может потребоваться добавить "alias =" в ваш файл ~/.hgrc.
Начиная с Mercurial 1.7, расширение alias узнало о "!" escape для использования команд оболочки, поэтому теперь вы можете иметь глобальный псевдоним, который делает это:
[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
Чтобы увидеть статус рабочей области относительно текущего каталога, вы всегда можете использовать ".". (одна точка) в качестве аргумента "статус hg", то есть:
% 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
%
Ответ 3
Hg со временем улучшается:
С hg 2.2.3 я могу определить псевдоним st
.
[alias]
st = !hg status $($HG root) $HG_ARGS
Следовательно:
-
hg st
предоставит вам путь относительно текущего каталога -
hg status
предоставит вам путь относительно корневого каталога hg
Ответ 4
Я добавляю этот ответ не потому, что это лучше, чем принятый ответ, а потому, что он разъясняет различие между "статусом hg". и "hg status $(hg root)". Который, возможно, путал некоторых комментаторов - хуже, что может привести к забыванию проверить необходимые вещи.
"hg status." только статус отчетов для поддерева под ним., используя относительные пути.
"hg status $(hg root)" сообщает статус для всего репо, используя пути относительно CWD.
Оба полезны.
(В общем, "hg status path" показывает статус для поддерева под дорогой (весь репо, если path = $(hg root) ", но относительно CWD. (Должен признать, что я нахожу это запутанным, потому что происходят две вещи: поддерево, чтобы получить статус, и cwd для отображения путей относительно.))
Это показано на примере сеанса оболочки, встроенного ниже.
$ 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", но приведенный выше пример достаточен.
Ответ 5
Стандартный способ, который работает со старых меркуриальных версий ( >= 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) вы можете сообщить команде статуса всегда печатать относительные пути, поместив это в свой hgrc
:
[commands]
status.relative = True
Тестирование непосредственно в командной строке (hg >= 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
Если вы находитесь на современном меркуриальном ( >= 4.3), это официально рекомендованный способ.