Mercurial HG статус отображения игнорируемых файлов - PullRequest
7 голосов
/ 22 марта 2011

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

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

$ hg addremove
$ hg commit 
nothing changed     

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

$ 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 ]

5 голосов
/ 22 марта 2011

Ваш синтаксис регулярного выражения неверен. У вас есть это:

syntax:regexp
^target*$

, что означает «игнорировать все, что начинается с цели и заканчивается звездочкой

Что не может игнорировать это:

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

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

Что вы, вероятно, имели в виду, было так:

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

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

syntax:regexp
/target/

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

2 голосов
/ 22 сентября 2011

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

1 голос
/ 22 марта 2011

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

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

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

    hg status -an0 | xargs -0 hg revert

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

  5. 1020 * совершить *

Теперь вы не должны видеть пропущенные файлы в выводе статуса hg.

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

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

1 голос
/ 22 марта 2011

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

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

Я могу воспроизвести вашу ситуацию, отменив любое разрешение на чтение из файла игнорирования и используя -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 не удается прочитать файл игнорирования и, следовательно, не знает, что target stuffследует игнорировать.Здесь было бы полезно соответствующее предупреждение от hg.

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

0 голосов
/ 23 января 2012

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

Если вы используете TortoiseHg, вы можете выбрать «Редактировать фильтр игнорирования» в контекстном меню (окна), чтобы проверить и изменить там свои настройки .hgignore.

0 голосов
/ 12 апреля 2011

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

Или я скучаю по чему-то здесь?

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

0 голосов
/ 22 марта 2011

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

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

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

hg status -mard

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

...