Visual studio Visual Studio是否可以记住源文件的MD5,以避免在时间戳更改而内容更改时重建它们?

Visual studio Visual Studio是否可以记住源文件的MD5,以避免在时间戳更改而内容更改时重建它们?,visual-studio,visual-studio-2010,build-process,Visual Studio,Visual Studio 2010,Build Process,大多数时候,我在同一个项目上做了几个不同的开发,为了在它们之间有一些逻辑上的分离,我在一个项目上使用了个人版本控制系统(也就是说,这可能太详细了) 这允许我在不同的分支中提交我的工作,以便以后合并它们。同时,我维持着一个主干分支机构,在那里我负责同事的工作 但是,当我从一个分支切换到另一个分支(例如为了执行一些合并操作)并返回到我所在的位置时,VisualStudio将检测时间戳修改,并重建尚未真正修改的文件 P>是否有一种方法让VisualStudio考虑到只有当它的内容中的某个散列发生变化

大多数时候,我在同一个项目上做了几个不同的开发,为了在它们之间有一些逻辑上的分离,我在一个项目上使用了个人版本控制系统(也就是说,这可能太详细了)

这允许我在不同的分支中提交我的工作,以便以后合并它们。同时,我维持着一个主干分支机构,在那里我负责同事的工作

但是,当我从一个分支切换到另一个分支(例如为了执行一些合并操作)并返回到我所在的位置时,VisualStudio将检测时间戳修改,并重建尚未真正修改的文件

<> P>是否有一种方法让VisualStudio考虑到只有当它的内容中的某个散列发生变化时,源文件发生了变化?

因为答案似乎是“不”,这里有另一种实现我想要的方式,为此我开始了一次悬赏。请继续阅读上面的内容

您知道一种简单的方法来获取源文件的时间戳和MD5哈希的快照,然后,对于时间戳发生更改的每个文件,比较MD5和回滚时间戳修改(如果MD5没有更改)


谢谢你的回答。

恐怕这是不可能的

这里的问题是,这不仅仅是VS的事情,实际上是整个构建系统的事情,它与实际的IDE非常分离。
为了决定是否应编译和
.obj
,VS将其时间戳与源文件的时间戳进行比较。按照您的建议执行操作需要
.obj
文件包含该文件的MD5。这也适用于
.exe
.dll
文件。更改这些文件的二进制格式,对于这样一个很少需要的功能来说不太可能发生


编辑-我收回它,这在理论上可能是可能的。一种方法是编写VS插件。插件会将MD5保存到输出目录中的某个文件中,并且在构建开始之前将更新相应文件的修改日期


进一步考虑,使用预构建步骤可能会实现这一点。

一个简单的解决方法可能是编写一个脚本,查看Visual Studio不知道的文件,如果该文件已更改,则复制它以覆盖Visual Studio知道的文件。VisualStudio看到的文件随后被从源代码管理中排除,因此不应触及它的时间戳

复制决策可能基于散列,但它同样可以轻松地直接比较源文件和目标文件


VisualStudio绝对有能力在构建中包含代码生成器——在VisualStudio看来,这就是这个脚本。不过我不知道细节——我让cmake帮我管理这些东西。

我想如果你的文件没有更改,让fossil或你的其他源代码管理工具不更改时间戳会更好。但是,将其应用到VS的构建系统中也会很有趣。我同意Rup。切换到SVN,我相信可以将其配置为在没有任何更改的情况下不更新文件上次修改日期。并研究如何使用MSBuild脚本,这样您就不必在VisualStudioIDE中执行所有操作。使用脚本语言非常简单。@Monkey扳手:否。SVN需要安装服务器。我将保留化石,因为它是一个单一的可执行文件,不需要在后台运行服务器或进程,并且因为它将我的所有历史版本存储在一个文件中。不过,您不必更改.obj格式:您可以计算MD5并存储它(以及.obj的最后修改时间以防万一)在文件旁边的NTFS流中。我认为没有必要对.exes和.dll也这样做-这只是他担心的obj steam的来源。但是我同意这可能很难连接起来,如果IDE也独立于构建系统进行检查,我也不会感到惊讶。为什么要将它放在
.obj
中呢?这太过分了,替代方案是可能的(创建另一个文件,如果在NTFS驱动器上,还有其他可能的替代数据流)(@Rup:和你在同一分钟的想法相同)我已经更新了我的问题。可能有一个系统会使用
touch
或其他时间戳修改软件来还原不重要的时间戳修改。此外,如果您尝试编写一个扩展来执行此操作,则每个文本缓冲区都有一个接口,用于向其请求MD5哈希(
IPersistFileCheckSum
),它经过优化,在不更改缓冲区的情况下使用缓存值,以减少对性能的影响。这是调试器在检查文件版本是否与生成的版本匹配时使用的方法。这可能是一种很好的方法。谢谢