Постоянно сливается .hgignore в Mercurial - PullRequest
2 голосов
/ 13 октября 2011

Это вопрос процесса, поэтому может быть более одного правильного ответа. Я возьму все, что имею сейчас, хотя.

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

В соответствии с установленной литературой и рекомендациями "некоторых ребят в Интернете" :) наша команда постоянно обновляет файл .hgignore, чтобы hg addremove всегда делал правильные вещи. Кроме того, отсутствующие файлы, которые необходимо добавить, являются причиной # 1 сбоя сборки, поэтому важно, чтобы hg st возвращал только те файлы, которые действительно требуют действий.

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

Это приводит к тому, что разработчики не хотят добавлять файлы в .hgignore, поскольку они знают, что на это уйдет как минимум несколько дополнительных минут. У нас довольно большой проект с довольно большой командой, которая постоянно меняется. Новые артефакты сборки вводятся довольно регулярно, поэтому проблема, похоже, не исчезнет. .hgignore на самом деле не очень стабилизируется, так как проект сильно меняется. (Что само по себе является другой проблемой, конечно.)

«Правильный» поступок, который нужно сделать, это «всегда брать обе стороны» почти всегда. Технически, два человека могли изменить ту же самую предыдущую строку с помощью текстового редактора, но это очень маловероятно. Маловероятно, что даже если подход «возьми оба» не удался, последствия будут незначительными.

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

Редактировать 1: Вот (явно отредактированная) версия моего текущего .hgignore. Вы можете легко заметить, что используются несколько разных технологий. Несколько частей кода находятся в процессе перехода от одной технологии к другой (например, с VB на C #). Это приводит к изменению набора артефактов сборки и необходимости обновления файла.

syntax: glob
*.obj
*.tds
*.map
*.il?
*/obj/*
*/lib/*
*/pch/*
Foo/Engine/frezbat/DocFiles.hpp
Foo/Engine/personal_defines.h
Foo/Engine/revision.cpp
Foo/Engine/frobbish/uLinkHlp.hpp
Foo/Engine/dll/XMLData/**.xml
Foo/Engine/dll/*.syslog
Foo/Engine/dll/*.log
Foo/Engine/dll/Scripts
Foo/Engine/dll/Linked Models
Foo/Engine/dll/prv
Foo/Engine/dll/pub
Foo/Engine/dll/failures.txt
Foo/Engine/dll/users.prm
Foo/Engine/tools/SrvIface/**.dll
Foo/Engine/tools/SrvIface/**.exe
*/dll/*.ini
*/dll/*.exe
*/dll/*.dll
*/quux_obj/*
*.dbg
*~
scripts/backupPath.txt
*.local
*.orig
FooDoc/FooDoc/bin/*
FooDoc/FooDoc/FooDoc.suo
FooDoc/FooDoc/FooDoc.vbproj.user
FooDoc/FooDoc_Setup/Release
Foo/Engine/dll/FooObjects.pdb
Foo/Engine/dll/FooObjects.tlb
Foo/Engine/dll/FooObjects.xml
Foo/Engine/dll/InitechDebugTimer.txt
*.dsk
Foo/Engine/dll/Preferences/CustomToolbar.ini
Foo/Engine/Engine.~dsk
Foo/Engine/dll/ApplicationSettings.fooprefs
Foo/Engine/dll/Foo.cgl
Foo/Engine/dll/IniShare.mem
Foo/Engine/baz_obj/*
Foo/Engine/baz_pch/*
*/dll/*.drc
*.~dsk
InitechBaz/InitechBaz/bin/Debug/InitechBaz.vshost.exe.manifest
InitechBaz/InitechBaz/bin/Debug/InitechBaz.vshost.exe.config
InitechBaz/InitechBaz/bin/Debug/InitechBaz.vshost.exe
InitechBaz/InitechBaz/bin/Debug/InitechBaz.exe.config
scripts/TestComplete/Ottertech_Replay/Log/*
scripts/TestComplete/Ottertech_Replay/[*
relre:ReSharper*
relre:_UpgradeReport_Files
glob:*.suo
glob:*.pdb
*.swp
Foo/Engine/FooObjects/FooObjects/bin/x86/
FooDoc/MCtoDAT/MCtoDAT/bin/x86
FooDoc/Deploy
Foo/Engine/installers/initech-build/bin/*
scripts/TestComplete/Users/*
Foo/Engine/dll/MCtoDAT.xml
FooDoc/Deploy/*
scripts/TestComplete/Ottertech_Replay/Log/*
scripts/TestComplete/Ottertech_Replay/[*
*.orig
Foo/Engine/installers/icon-installers-bin/*
Foo/Engine/Quux/Server/*.esp
Foo/Engine/Quux/BrapServer/*.esp
Foo/Engine/installers/bin/*.exe
Foo/Engine/installers/quux/encryptedsql/*.esp
Foo/Engine/tools/tempfile.tmp
*.pch
*.#*
*.#??
Foo/Engine/dll/frabbing.lib
re:^.*\.\#[0-9][0-9]$
Foo/Engine/Foo/FooObjects/FooObjects/FooObjects.xml
FooDoc/MCtoDAT/MCtoDAT/MCtoDAT.xml
*.sln.cache
FooDoc/TestFooObj/TestFooObj/bin/
*.user
Foo/Engine/FooObjects/FooObjects/FooObjects.xml
Foo/Engine/FooObjects/FooObjects/FooObjects.xml
FooDoc/MCtoDAT/MCtoDAT/MCtoDAT.xml
*/Debug Installer/*.dll
*/Debug Installer/*.tlb
*/Debug Installer/*.xml
*/Debug Installer/*.msi
*/Debug Installer/*.exe
FooDoc/FooDoc_Setup/Debug/*
re:(?i).*\/UpgradeLog.xml
*.sln.cache

Ответы [ 3 ]

3 голосов
/ 13 октября 2011

Обычно в начале проекта происходит целый ряд изменений в игнорируемых файлах, но они быстро решаются. Я предполагаю, что вы не используете подстановочные знаки эффективно. Если вы не можете придумать, как использовать подстановочные знаки в вашей ситуации, вам, вероятно, нужно спроектировать свой код, чтобы все вновь созданные игнорируемые файлы помещались в один каталог. Например, поместив все артефакты сборки в каталог «build». Это немного больше впереди в ваших скриптах сборки, но также помогает с такими вещами, как завершение табуляции, так как в ваших исходных каталогах есть только исходные файлы.

2 голосов
/ 14 октября 2011

Переместите build-root за пределы дерева репо и получите исходники для строителя в результате hg export. Таким образом, вы можете убить двух зайцев одним выстрелом

  • объекты сборки не будут мусорить в хранилище
  • вы можете проверить, что все необходимые файлы находятся в хранилище
0 голосов
/ 20 октября 2011

Как и любой инструмент, Mercurial может зайти так далеко. Как указывалось ранее, большинство структур проекта через некоторое время стабилизируются, что делает ваши проблемы менее значимыми в стандартном сценарии использования, чем в вашем.

В вашем случае вполне может быть, что вам просто нужно с этим жить.

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

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

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

...