这是一个过程问题,所以可能有不止一个正确答案。不过,我会接管我现在所拥有的一切。
我的团队最近转而使用 Mercurial(来自 Subversion),并且在大多数情况下,我们喜欢新的功能。但是,有一些事情会降低生产力。其中一件事是管理.hgignore
文件。
根据既定文献和“互联网上的一些人”的建议:),我们的团队正在使.hgignore
文件保持最新状态,以便hg addremove
始终做正确的事情。此外,缺少需要添加的文件是构建失败的第一大原因,因此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