Delphi RES文件和Git

25

我有一个用Delphi编写的大型项目,想使用Git管理它的源代码。我创建了一个包含应用程序源代码和第三方组件的Git存储库。所有这些都是通过msbuild自动构建的。

最大的问题是RES文件。其中一些每次重新构建应用程序时都会更新,而有些则不会。有些具有*.rc源文件,而有些则没有。我不能忽略所有res文件(.gitignore),因为没有资源,我的项目将构建失败。另外,我不能包括res文件-它们在每次构建时都会更改,我不想看到它们的差异。

你在Git下如何处理*.res文件?有什么建议吗?

6个回答

17

欢迎加入本俱乐部。在Delphi中,应用程序.res文件对于使用源代码控制的每个人来说都是一个棘手的问题。您想要使用自动增量构建号,但会破坏您的源代码控制。

我的做法是:

  • 将图标和版本资源拆分如下:

    {$R *_icon.res}

    {$R *._version.res}

  • 禁用构建号的自动增量

  • 为项目添加预构建事件,该事件会:

    • 递增与项目对应的.ini文件中的构建号
    • 从.ini文件生成版本信息的.rc文件
    • 从.rc文件编译.res文件
  • 将*_icon.res文件添加到源代码控制中,因为它永远不会更改,所以这样做是安全的

  • 将包含版本信息的.ini文件添加到源代码控制中,因为它是文本文件,易于进行差异对比

我编写的用于生成版本.res文件的工具是免费软件,在此处OSDN上均可获取。


12

我将我的RES项目文件存储在git中(与dpr文件名相匹配的文件)。

我认为,如果您设置了增量构建编号,而项目RES文件每次构建都会更改,那么唯一的原因就是您需要将res文件存储在源代码控制中,否则您不关心构建编号,所以应该关闭该选项。

我还从RC编译生成RES文件,这些文件每次编译都会更改,因此我有一个.gitignore文件来忽略*.res文件,并且我随后添加git add -f project.res命令来跟踪项目RES文件。


谢谢你的建议,但我有25个以上带源代码(还有该死的资源文件)的组件。找出哪些资源文件被更改了,哪些没有被更改,需要花费很多时间。但最大的问题是有些资源必须包含在内(所以我使用git add -f),并且每次重建组件时都会更改。 - Frantic
终于完成了。花了很多时间,但是我对结果感到满意。 - Frantic

2

按照定义,RES文件是已编译的RC文件。因此,理想情况下,您应该忽略所有RES文件,并仅提交RC更改。如果出现某个特定RES文件没有RC源的情况,那么只需将此“孤立”的RES文件添加到git中 - 这些文件不应在构建之间更改(因为没有RC文件可以从中生成它们)。如果由于某种奇怪的原因(Delphi,哼),这些RES文件确实发生了变化,那么您将无可救药。

最重要的是:RES文件是编译目标 - 与其他二进制文件(obj,exe等)没有任何区别。


10
在Delphi中,项目的RES文件与其他二进制文件不同,它没有相应的RC文件,并且包含在其他任何地方都找不到的信息,例如图标和版本号。 - jasonpenny
我明白了,所以你注定要穿过这些环(Delphi 最好!),其他回答会提供详细的说明 :) - ygrek

2
强烈建议在项目设置中禁用“自动增量版本号”,无论使用何种版本控制系统。这样可以“安全”地将.res文件添加到存储库中。
我已经寻找了很长时间的方法来自动更新项目的.res文件中版本信息中的构建编号,但最好的方法是使用额外的.rc文件更新版本信息。实际上,在发布二进制文件之前,我通常仅将构建号更新为当前子版本修订号。

0

我不了解GIT,但在SVN下,我只需“SVN ADD”那些重要的文件,而不是自动生成的文件。由于未版本化的文件被排除在差异之外,这也就解决了。


0

您能做到吗:

  • 忽略所有.res文件
  • 生成可以生成的.res文件(编译资源脚本.rc文件)
  • 仅添加没有.rc文件以生成它们的.res文件:如果您在.gitignore中指定要忽略它们,则添加它们是可以的:它们不会显示在差异中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接