Подтвердить что ты не робот

Меркуриальный статус "hg" и относительные пути

Я использую как mercurial, так и git для разных проектов и люблю их обоих. То, что я нахожу немного раздражающим в отношении меркуриала, заключается в том, что "статус hg" показывает пути относительно корня репозитория, а не текущего каталога (в отличие от git). Может ли это поведение каким-то образом изменить?

4b9b3361

Ответ 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), это официально рекомендованный способ.