我有其他人必须遇到的以下问题。我正在开发一个在两个不同平台上运行的代码库。大多数代码在平台之间共享,但代码的某些部分针对特定平台进行了优化。因此,文件foo()
中可能存在函数foo.cpp
的通用实现,以及文件foo_A.cpp
中针对平台A优化的实现。
当然,有时会发生的情况是开发人员修改foo.cpp
并忘记对foo_A.cpp
进行相应更改以使其保持同步。这导致非常令人不快的错误,很难追查。
最后,这是我的问题:有没有办法在Subversion中“纠缠”两个或更多文件?是否有可能每当提交更改foo.cpp
以使svn发出警告时,都会提醒您更新foo_A.cpp
?
答案 0 :(得分:7)
您可以编写一个pre-commit hook进行检查,以确保在其中任何一个提交时foo.cpp
和foo_A.cpp
都存在。
它可以只显示一条警告消息并继续,或者实际上通过返回错误(您的选择)来使提交失败。
答案 1 :(得分:3)
Subversion有你可以使用的钩子。基本上,您在正确的文件夹中使用正确的名称编写脚本。它可以检查是否签入了一个特定命名的文件,然后做一堆响应。 (换句话说,每次签入另一个文件时,您都可以自动更新一个文件。)
这通常是一个坏主意。重构项目以便共享同一个文件通常是一个更好的解决方案。
答案 2 :(得分:2)
如果foo.c作为提交的一部分被修改但foo_A.c不是,则可以使用pre-commit hook来拒绝提交。根据项目中的文件数量,通过在钩子脚本中明确列出文件可能难以管理。
如果您有一些一致的文件命名约定,则可以在脚本中放置一些智能模式匹配逻辑。 (例如,如果您知道优化文件的名称始终以“_A”结尾,则可以更轻松地自动执行检查。)
作为替代方案,您可以尝试在构建过程中解决问题。构建脚本可以对这两个文件执行“svn info”,如果两个文件的SVN rev号不一致,则抛出警告/错误。但是,由于合法的原因,可能很难检测转数是否不同(例如,您故意仅编辑了其中一个文件)。
然而,正如评论者指出的那样,老实说,我觉得你正试图错误地解决问题。我将尝试构造代码以防止这类错误首先发生。如果两个函数需要同时更改,则表示代码库中存在不必要的重复。看看在一个地方合并两个文件的共同元素。
答案 3 :(得分:1)
由于您使用的是编译语言,您是否考虑在优化函数中编写#ifdef
(检查定义平台的标志)而不是仅编写一个全新的函数?
答案 4 :(得分:0)
您可能还希望对该文件进行单元测试,通过持续集成在两个平台上运行 - 然后可能会检测到仅中断一个平台的更改。至少它会验证两个实现在编译期间是否公开相同的接口。