Это вопрос процесса, поэтому может быть более одного правильного ответа. Я возьму все, что имею сейчас, хотя.
Моя команда недавно перешла на использование 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