Mercurial: как игнорировать изменения в отслеживаемом файле

У меня есть файл с настройками базы данных в моем проекте, для которого я установил некоторые значения по умолчанию. Файл отслеживается Mercurial и регистрируется. Поскольку этот файл будет редактироваться с разными значениями на разных машинах разработчика, могу ли я сказать Mercurial игнорировать новые изменения в этом файле?

Я попытался добавить файл в .hgignore файл, но поскольку файл отслеживается, он не игнорируется. Это нормально и хорошо в других ситуациях, но мне интересно, могу ли я что-нибудь здесь сделать?


person Svish    schedule 18.05.2010    source источник


Ответы (8)


Использование шаблона файла - определенно лучшее решение. Например, если у вас есть database.ini файл, зафиксируйте database.ini.template файл и игнорируйте database.ini в .hgignore

person yanjost    schedule 18.05.2010
comment
Это то, чем я закончил :) - person Svish; 25.05.2010
comment
Я понимаю, что сейчас это очень старо, но на всякий случай - был бы у вас сценарий установки, который копирует все файлы шаблонов в их рабочие имена? - person Nick; 18.06.2013
comment
Это было бы хорошей идеей. Не забудьте сделать так, чтобы ваш скрипт запрашивал значения конфигурации, так как они могут отличаться от файла шаблона, который здесь, чтобы показать структуру файла. - person yanjost; 26.06.2013
comment
Действительно большая проблема с этим подходом заключается в том, что он может испортить процессы сборки - например, при использовании msdeploy в .net вы развертываете все файлы, перечисленные в файле csproj. Это означает, что если вы хотите, чтобы ваш db.ini файл был включен в развертывание, он должен быть указан в csproj. НО, если вы укажете его в csproj, вы не сможете создать чистый клон, пока не создадите этот файл , даже если файл на самом деле является необязательным для запуска приложения - person George Mauer; 23.07.2016
comment
@GeorgeMauer Итак, проблема в том, что какой-то процесс ожидает получить полностью работающую настройку файла, указав репозиторий и загрузив файлы. В идеале у него (msdeploy) должна быть возможность запустить сценарий настройки / установки в репозитории перед его использованием. Или вам нужно будет создать специальный репозиторий (или ветку), который является копией основного репозитория, но с заменой .template реальными файлами, только для использования с этим процессом. Кроме того, есть проблема с msdeploy в том, что он смотрит только на csproj, чтобы знать, что развертывать. Возможно, вы можете настроить его, чтобы включить другие. - person Ben J; 06.03.2019
comment
Противоположный подход состоит в том, чтобы люди, использующие репо, добавляли файл .local и обновляли инструменты / все, что использует этот файл [если применимо] в их локальной копии (и заставляю Mercurial игнорировать эти изменения). Это работает только тогда, когда материал, который использует файл, настраивается (может указывать на новый локальный файл). Если вы хотите, чтобы они изменили .template файл в своей локальной копии (но любые инструменты / все, что использует этот файл [если применимо], не работают, пока они не сделают этого), см. [Текущий] ответ. При первом подходе репо ожидает изменения, а при другом пользователь создает его позже. - person Ben J; 06.03.2019
comment
Например. Если отслеживаемый файл, который вы хотите игнорировать, сам .hgignore, вы можете добавить .hgignore.local и настроить .hgrc так, чтобы он распознавал и этот файл. См. 1, 2. - person Ben J; 06.03.2019
comment
.template лучше, если файл является необязательным, поскольку он не помещает файл по умолчанию, а .local лучше, если файл нужен по умолчанию или немедленно. Если есть много вещей, которые отслеживаются и используют файл, тогда также предпочтите подход .template, потому что пользователю репозитория будет меньше вещей, которые нужно будет изменять в своей локальной копии. .local более идеален, когда то, что использует файл, не отслеживается и может быть настроено для использования другого файла, или вы не можете предвидеть, какие файлы или есть много файлов, которые будут изменены. - person Ben J; 06.03.2019

Если вы всегда хотите игнорировать файл, вы можете добавить параметр -X по умолчанию для commit в свой .hg/hgrc файл конфигурации:

[defaults]
commit = -X program.conf
person sth    schedule 01.09.2010
comment
Это действительно отличная идея, пока вы не попытаетесь совершить слияние. При фиксации слияния вам не разрешается указывать файлы или шаблоны. Таким образом, с этим в вашем .hgrc, похоже, невозможно вообще зафиксировать слияние без предварительного редактирования .hgrc. У кого-нибудь есть решение? - person Yitz; 13.02.2014
comment
Вы спрашивали об этом много лет назад @Yitz, но в случае, если это полезно, быстрое и грязное исправление, которое я использую, - это быстрый пакетный скрипт, который перемещает репозиторий hgrc, выполняет фиксацию и перемещает его обратно. Очевидно, это сработает только в том случае, если в вашем hgrc больше ничего не должно быть. - person Kevin Shea; 11.09.2015
comment
@yitz Интересно, это не сработало для вас потому, что файл должен называться hgrc, а не .hgrc? - person teaman; 16.12.2017

Мы написали для этого расширение под названием exclude. Он автоматически добавит параметры -X к командам, которые их поддерживают, поэтому hg status и hg commit не увидят измененный файл. Он работает путем чтения файла .hgexclude из корня вашего репозитория, как и файл .hgignore. Вы добавляете туда файлы, которые хотите исключить:

syntax: glob
db.conf

Расширение работает довольно хорошо, но есть известная ситуация, когда оно не работает: слияние и фиксация, которая следует за слиянием (это задокументировано в вики). Его необходимо улучшить, чтобы он сохранял изменения во временном файле, а затем восстанавливал их. Свяжитесь с нами, если вам нужна эта функция.

person Martin Geisler    schedule 20.07.2011

По-настоящему автоматизированного процесса нет, но вы можете попробовать (как в этом SO question) параметр -X в hg commit:

% hg stat
M myfile
% hg commit -X 'myfile'

(другие решения могут включать полка или штаб-квартира)

Однако это не «правильное» решение. Я бы порекомендовал версионирование:

  • файл шаблон
  • сценарий, способный сгенерировать окончательный файл (который вы изменяете, но можете полностью игнорировать)
person VonC    schedule 18.05.2010

Если вы используете TortoiseHG, откройте настройки репозитория, перейдите в раздел «Фиксация» (2-й значок внизу слева) и добавьте имя (а) файлов в список «Автоисключение» справа (~ 3-й снизу в список).

Из https://tortoisehg.readthedocs.io/en/latest/settings.html#commit

person CAD bloke    schedule 16.02.2011
comment
Когда вы это сделаете и запустите пользовательский интерфейс фиксации, исключенный файл будет отключен в списке файлов фиксации (автоматически), а DIFF будет темно-серым. Хороший. - person jm.; 21.10.2014
comment
Я не могу заставить это работать, я использую TortoiseHg 3.3.3. Я добавляю имя файла, полный путь, частичное имя файла с помощью * - это всегда проверяется в пользовательском интерфейсе фиксации? - person gakera; 28.01.2016
comment
Если он уже отслежен (ранее зафиксирован), то его игнорирование не повлияет на него, вам нужно его забыть. - person CAD bloke; 28.01.2016
comment
allright @gakera в следующий раз, когда вы попытаетесь сделать это снова, помните, что tortoisHg не любит обратную косую черту в путях, то есть это работает: [tortoisehg] ciexclude = build / sol.sln. Однако это работает только для того, чтобы не включать файл sln в будущие коммиты, вы по-прежнему не можете легко слить с незавершенными изменениями этого файла в рабочем каталоге. :( - person gakera; 10.06.2016
comment
Тем не мение! Если вы забыли файл в TortoiseHg после добавления его в локальный файл игнорирования, этого будет достаточно и оно не повлияет на центральное репо. - Ба, он просто отображается как удаленный, я думаю, рабочий каталог не чистый с этим ... :( - person gakera; 10.06.2016
comment
Похоже, это именно то решение, которое мне нужно! Рабочие версии конфигурационных файлов проверяются в репо, но мне нужны нестандартные вещи для разработки. Если вы используете TortoiseHG (v5.0.2), откройте Настройки для репозитория (внизу контекстного меню, вызываемого правой кнопкой мыши), перейдите в раздел «Фиксация» (третий значок внизу слева) и добавьте имя (имена) файла (запятая разделенные, включая относительные пути) в список автоисключения справа (7 сверху вниз, 8 снизу вверх, справа). - person Alan Stewart; 25.03.2020

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

Если ваша система конфигурации поддерживает это, будет еще проще, если вы можете использовать файл переопределения, который просто переопределяет значения в эталонной копии (например, строку подключения к базе данных). Таким образом, разработчики должны поддерживать минимальный локальный набор значений переопределения.

person Paolo    schedule 18.05.2010

Если файл уже отслеживается, вы можете дать ему команду «Забыть». Если вы используете TortoiseHg, просто щелкните файл правой кнопкой мыши во время фиксации и выберите «Забыть». Файл также должен быть уже в списке игнорирования.

У меня была та же проблема, что и у вас, файл I продолжает появляться при каждой фиксации, хотя он уже находится в списке игнорирования. Я попробовал команду «Забыть», и она сработала.

person radztech    schedule 10.04.2012

Вы можете попробовать hg forget. Дополнительные сведения см. В официальном руководстве по той же команде. У меня это сработало.

Думаю, что-то подобное ближе к правильному ответу на исходный вопрос Mercurial: Как игнорировать изменения в отслеживаемом файле, а не другие, предлагающие шаблон и т. Д.

person András    schedule 04.06.2013
comment
Этот ответ эквивалентен ирландскому ответу. Проблема в том, что hg forget удаляет существующее содержимое файла из репозитория, чего OP не хотел. - person Brilliand; 28.11.2013