Version control 不断地融合。在变化无常中忽略

Version control 不断地融合。在变化无常中忽略,version-control,mercurial,hgignore,Version Control,Mercurial,Hgignore,这是一个过程问题,因此可能有不止一个正确答案。不过,我会接管我现在拥有的一切 我的团队最近从Subversion转向使用Mercurial,在很大程度上,我们喜欢新的功能。然而,有一些事情降低了生产率。其中之一就是管理.hgignore文件 根据已建立的文献和互联网上一些人的建议:,我们的团队保持.hgignore文件的最新状态,以便hg addremove总是做正确的事情。此外,缺少需要添加的文件是构建失败的首要原因,因此hg st只返回真正需要操作的文件非常重要 问题是,由于我们总是在文件的

这是一个过程问题,因此可能有不止一个正确答案。不过,我会接管我现在拥有的一切

我的团队最近从Subversion转向使用Mercurial,在很大程度上,我们喜欢新的功能。然而,有一些事情降低了生产率。其中之一就是管理.hgignore文件

根据已建立的文献和互联网上一些人的建议:,我们的团队保持.hgignore文件的最新状态,以便hg addremove总是做正确的事情。此外,缺少需要添加的文件是构建失败的首要原因,因此hg st只返回真正需要操作的文件非常重要

问题是,由于我们总是在文件的底部添加新的忽略,因此如果两个人进行.hgignore更改,则总是会导致合并冲突。大多数人使用龟甲客户端,它添加到文件的末尾。这样做的结果是,在更改文件的一半时间里,更改文件的人必须处理.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

通常,在项目开始时,ignore文件中会有一系列的更改,但很快就解决了。我猜你没有有效地使用通配符。如果您不能考虑在您的情况下如何使用通配符,那么您可能需要构建代码,以便新创建的被忽略文件都放在一个目录中。例如,将所有构建工件放入一个构建目录。这在构建脚本中是一项更为前期的工作,但也有助于完成制表符之类的工作,因为在源目录中只有源文件。

将构建根目录移到repo树之外,并作为hg导出的结果为builder获取源。这样你可以一石二鸟

生成对象不会丢弃在存储库中 您可以验证所有需要的文件是否都在存储库中
像任何工具一样,Mercurial只能做到这一点。正如前面指出的,大多数项目结构在一段时间后趋于稳定,使得您的问题在标准用例中的相关性不如在您自己的用例中

在你的情况下,很可能你不得不接受这个

另一种方法是重新构造项目,使所有可忽略的文件都位于同一位置,或者通过通配符模式进行引用。我倾向于反对它,如果唯一的力量是需要缓解管理问题。换句话说,源代码管理系统的特性或局限性不应构成决定项目结构的力量

也就是说,通常会有真正的力量产生稳定的项目结构,这些力量超越了源代码控制。例如,开发人员需要熟悉项目,不断的更改会削弱熟悉度。显然你不是这样,因为你的源代码被忽略了


我知道这对回答您的问题不会有多大帮助,但我觉得问题不在源代码控制范围之内,而且在您的项目中,其他力量已经停止发挥影响。

这实际上也是我最初的假设。我认为,当所有构建工件都添加到系统中时,它会很快平静下来。另外,关于构建目录,您有一个很好的观点。改进这一过程已经在我们的路线图上,但如果有一个可以在短期内实施的解决方案,那就太好了。我注意到很多新的构建工件
随着项目的开发而增加,所以结算并没有按照我预期的方式进行。这就是我怀疑的,也许OP可以发布一个摘录,这样我们就可以用glob和/或regex来扩展这个答案,以匹配它们。唉,看起来答案真的很简单。虽然不令人满意,但至少我知道不要在上面花太多时间。谢谢你的帮助。你一直在对那个文件做什么样的更改?这是非常罕见的,这个文件有大量的搅动真的。我张贴了文件,让你可以看到。改变的部分原因是许多领域正在经历工具和技术的改变。理论上,这应该最终结束,但到那时,我们可能会在另一个领域做类似的事情。好吧,除了稍微压缩它,例如合并所有bin、obj和.tmp目录和文件夹等。然后我想你必须继续合并。在我看来,Beyond Compare是一个非常好的合并工具,它有一个先左后右的功能。不是自动的,但即使这样做也很容易。可能值得一看。嘿,这正是我们使用的。我甚至在分发照片时突出显示了“左拍,右拍”选项,这样人们就知道该怎么做了。