Mercurial HG статус отображения игнорируемых файлов

может ли кто-нибудь сказать мне, почему mercurial отображает игнорируемые файлы для команды "HG status"?

вот подтверждение того, что mercurial действительно игнорирует файлы:

$ hg addremove
$ hg commit 
nothing changed     

теперь взгляните на вывод состояния. Я запустил это сразу после строк выше. (Prinout является частичным, с идентифицируемым текст удален)

$ hg status
? Core/target/Core-0.0.1-SNAPSHOT-tests.jar
? Core/target/Core-0.0.1-SNAPSHOT.jar
? Core/target/classes/META-INF/MANIFEST.MF
? Core/target/classes/xxx/yyy/zzz/X.class
? Core/target/classes/xxx/yyy/zzz/XBackup.class
? Core/target/classes/xxx/yyy/zzz/XBackupInput.class
? Core/target/classes/xxx/yyy/zzz/XBackupOutput.class
? Core/target/classes/xxx/yyy/zzz/XImpl$GetResultsAndStatistics.class
? Core/target/classes/xxx/yyy/zzz/XImpl$MonitoringMode.class
? Core/target/classes/xxx/yyy/zzz/XImpl$UpdateMode.class
? Core/target/classes/xxx/yyy/zzz/XImpl.class
? Core/target/classes/xxx/yyy/zzz/XIsFullException.class
? Core/target/classes/xxx/yyy/zzz/XSource.class
? Core/target/classes/xxx/yyy/zzz/XUsageException.class
? Core/target/classes/xxx/yyy/zzz/CheckResults.class
? Core/target/classes/xxx/yyy/zzz/Noise.class
? Core/target/classes/xxx/yyy/zzz/core/DateTimeGenerator$TemporalMeasure.class
? Core/target/classes/xxx/yyy/zzz/core/DateTimeGenerator.class
? Core/target/classes/xxx/yyy/zzz/core/LoggingConfigurator.class
? Core/target/classes/xxx/yyy/zzz/core/ManagedIterator.class
? Core/target/classes/xxx/yyy/zzz/core/NetworkUtils.class
? Core/target/classes/xxx/yyy/zzz/core/StackTraceUtils.class
? Core/target/classes/xxx/yyy/zzz/core/Summarisable.class
? Core/target/classes/xxx/yyy/zzz/core/TimingUtils.class
? Core/target/classes/xxx/yyy/zzz/core/XMLStaticStringUtils.class
? Core/target/classes/xxx/yyy/zzz/core/Zipper.class
...

есть что-то вроде тысячи строк этих игнорируемых файлов, отображаемых в распечатке состояния; это серьезно пустая болтовня.

как я могу избавиться от этого?

спасибо

обновление:

вот мой .hgignore файл.

syntax:glob
.metadata*

syntax:regexp
^target.*$
^[^/]*/target.*$
^[^/]*/[^/]*/target.*$
^bin.*$
^[^/]*/bin.*$
^[^/]*/[^/]*/bin.*$

обновление:

измененные регулярные выражения немного* -> .*

7 ответов


ваш синтаксис regexp неверен. У вас есть это:

syntax:regexp
^target*$

что означает " игнорировать все, начиная с target и заканчивая звездочка

который не может игнорировать эти:

Core/target/classes/META-INF/MANIFEST.MF
Core/target/classes/xxx/yyy/zzz/X.class

по двум причинам-они начинаются с Core/ не target и они не заканчиваются звездочкой.

вы, вероятно, имели в виду следующее:

syntax:regexp
^.*/target/.*$

который соответствует всему, что имеет /target/ в нем (обратите внимание на это .* в регулярное выражение * для стиля Глоба). Однако ^ и $ служат только для укоренения вашего регулярного выражения, и вы не хотите, чтобы оно укоренилось - вы хотите найти его в любом месте строки, поэтому просто сделайте это:

syntax:regexp
/target/

ключом ко всему этому было то, что файлы были помечены ? что означает не игнорируется и не добавляется, если бы они были проигнорированы, вы бы не увидели их вообще без добавления --ignored на состояние команды.


Я получил аналогичную проблему, потому что я изменил случай письма для некоторых файлов. Поэтому ранее я получил файл под названием "sitenav.ext", переименовал его в " siteNav.ext "и начали иметь такие же проблемы - когда я попытался "hg st " я получил"? ситенав.доб." Исправить было легко переименовать в "_siteNav.доб", addremove, совершать, переименовать обратно в " siteNav.доб", addremove, commit - > прибыль!


прокомментировал Джером в вопросе, предоставление вашей конфигурации может помочь.

одной (по общему признанию странной) причиной вашей проблемы может быть проблема с разрешением .hgignore файл в сочетании с exclude по умолчанию на .

я мог бы воспроизвести вашу ситуацию, отозвав любое разрешение на чтение из файла ignore и используя -X "**/target/**" в качестве опции по умолчанию для addremove команда (которая может быть установлена в любом из возможные файлы конфигурации Mercurial):

$ hg st
# no output, as expected
$ chmod 000 .hgignore
$ hg addremove # with '-X "**/target/**"' set as default somewhere
$ hg commit 
nothing changed  
$ hg st
? Core/target/Core-0.0.1-SNAPSHOT-tests.jar
? Core/target/Core-0.0.1-SNAPSHOT.jar
...

hg не удается прочитать файл игнорирования и, следовательно, не знает, что цель вещи следует игнорировать. Соответствующее предупреждение от hg было бы полезно здесь.

этот вопрос был обновлен в ответ на комментарий Джерома.


большое спасибо за помощь в этом. Я не нашел ответа на проблему, но я нашел обходной путь, который избавился от него. Поэтому я предполагаю, что в какой-то момент при изменении hgignore regexps mercurial запутался и испортил его внутренние данные... или что-то. Я не знаю достаточно внутренних органов, чтобы знать, что это могло быть.

в любом случае, если вы окажетесь в одной лодке, вот что я сделал:

  1. убедитесь, что ваш .файл hgignore говорит то, что вы хотите, и что все файлы, появляющиеся в состоянии hg, являются теми, которые вы хотите игнорировать.
  2. добавить все файлы, которые будут проигнорированы. HG addremove не работает, потому что он чтит содержимое hgignore, поэтому я использовал плагин Hg Eclipse и делал каждый файл вручную (Ну, я выбрал их все, и Eclipse применил добавление ко всем им по отдельности).
  3. отменить все добавленные файлы. Я использовал следующее, потому что я на linux. (благодаря другому плакату на отдельном вопрос здесь на SO-который я больше не могу найти к сожалению)

    HG status-an0 / xargs -0 HG revert

  4. повторите вышеуказанный шаг, пока он больше не будет работать. В моем случае это было иногда до 3 возвращается в ряд! (Не знаю, что он на самом деле делал :( )

  5. commit

теперь вы больше не должны видеть игнорируемые файлы в выводе состояния hg.

извините, я понятия не имею, почему это сработало, или в чем была изначальная проблема. Если кто-то знает, мне было бы очень интересно узнать ваши мысли.

еще раз большое спасибо всем :)


? не значит игнорировать.

Это просто означает, что mercurial не отслеживает файл.

Если вы не хотите их видеть, просто сделайте

статус hg-mard

т. е. показывать только измененные, добавленные, удаленные, удаленные


ваш .файл hgignore говорит, что "^target " игнорируется, но файлы находятся в Core/target. Поэтому строка игнорирования должна быть " target "(без ^) или"^Core/target".

или мне не хватает sth здесь?

(Примечание: ^ подразумевает, что соответствие регулярным выражениям начинается с начала пути, т. е. только пути начиная с С целью будет соответствовать!)


была та же проблема, и ответ Боба сделал трюк для меня.

Если вы используете TortoiseHg, вы можете выбрать "edit ignore filter" в контекстном меню (windows), чтобы проверить и изменить свой .параметры hgignore есть.