1

在这里阅读了一些关于这个主题的帖子后,我意识到有很多反对使用关键字替换的缺点。尽管如此,我需要一种方法来解决以下问题,并希望有人可能对如何使用 git 解决这个问题有一个想法(无论是否使用关键字替换):

我有一个使用 git 作为 VCS 的主应用程序。这个主要应用程序的一部分(一组 XML 文件)正在被一个实用程序使用,我也使用 git(单独的 repo)。

现在,主应用程序和实用程序具有不同的发布周期,每当我发布实用程序的新版本时,我都会从主应用程序复制最新的 XML 文件集。在该实用程序中,这组 XML 文件是 git 中的非版本控制内容,因此它甚至没有签入到 repo。

到目前为止,每当我查看此实用程序的不同版本(由 git 管理并标记版本)时,我都无法知道包含的 XML 文件集指的是哪个“版本”(更好:提交哈希) .

所以我在想:如果我可以在这些 XML 文件中拥有最新的提交 SHA(作为评论),我总是知道我的实用程序的某个版本引用了哪一组 XML 文件。这种方法有什么问题吗,或者这是要走的路?如果是,我如何将最新的 commit-SHA 放入我的 XML 文件中?(我读到 $Id:$ 不会接受 commit-SHA,而是一些“blob”-SHA?)

4

4 回答 4

5

两种选择

使用子模块

您可以将主应用程序构建为 XML 数据的 repo + 子模块。因为您不能将git-repo 的一部分用作另一个 repo 中的子模块,只能使用完整repo(Git-boys,FIXME),所以您必须将实用程序 repo 重新创建为“超级模块”并将 repo 分成两个 - 实用程序 + XML-数据

主仓库也成为“超级模块”,并将 1)包括主应用程序和 2)应用程序的 XML 数据

因为 Git 在主 repo 和子模块中为所有和任何基本变更集 ID(Git-boys,FIXME)保持严格的变更集关系,您只能知道主应用程序的哈希并与 XML-data 的这个变更集快照相关

去污过滤器

在保持 repos 完全独立的同时,您可以将跟踪数据添加到 XML 文件中。将任意关键字添加到 Git 控制的数据的正确方法是涂抹清洁过滤器(请参阅“关键字扩展”部分和 $Date$ 关键字扩展的示例)

于 2012-03-15T21:28:08.597 回答
2

如果 Git 没有跟踪该 XML 文件,那么这没有任何问题。我认为让构建基于某个可见的哈希值是一个非常好的主意,所以当出现问题时,你总是会知道这是基于什么版本的源代码。

仅出于完整性考虑,不可能在被跟踪的文件中包含哈希值。这是因为哈希是基于 Git 拥有的所有信息生成的。如果它将值插入到某个跟踪文件中,那么该文件将被更改,并且您需要进行另一次提交,或者必须更改先前的提交——这将导致不同的哈希值。

由于您的文件未被跟踪,因此对其进行的更改不会更改哈希值,因此上述不是问题。获取当前 SHA1 哈希的方法有多种,最简单的可能就是查看.git/refs/heads/master. 该文件是分支的指针master,并包含该分支中 HEAD 提交的哈希值。当然,/master如果您愿意,您可以更改为任何其他分支。

于 2012-03-15T12:36:59.663 回答
2

可能的解决方案是扩展主应用程序的构建过程,以便结果之一是打包的 XML 文件。此打包版本将包含有关主应用程序版本的附加信息。这样的软件包可以方便地与外部实用程序等捆绑在一起。

在构建期间,您可以使用git describeor直接从 git 获取版本信息git rev-parse HEAD(请参阅Injecting current git commit id into Java webapp

于 2012-03-15T12:59:05.727 回答
0

好的,伙计们,根据您的输入,这就是我所做的:

  1. 在我的 XML 文件中插入占位符:<!-- @GIT_VERSION@ -->
  2. 让 ant 获取 git 版本信息,注意这是 Windows:
  3. 让蚂蚁在复制它们时将此信息插入我的 XML 文件中。

代码:

<target name="getGitDetails">
    <exec executable="cmd" outputproperty="git.revision">
         <arg value="/c" />
         <arg value="git.cmd --git-dir=<path-to-repo> describe --long --dirty --always" />
    </exec>
     <exec executable="cmd" outputproperty="git.currentBranchRef">
         <arg value="/c" />
         <arg value="git.cmd --git-dir=<path-to-repo> describe --all" />
     </exec>
 </target>

 <target name="build" depends="getGitDetails">
     <copy todir="<dest-dir>">  
         <filterset>
             <filter token="GIT_VERSION" value="${git.currentBranchRef} ${git.revision}" />
         </filterset>
     </copy>
 </target>

谢谢你的帮助!

也可以看看:

如何从 ant 构建脚本中查找最新的 git commit 哈希

从`git describe`派生应用程序构建版本-如何获得相对简单的字符串?

于 2012-03-16T07:46:14.180 回答