Git关键字扩展或替代



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

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

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

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

所以我在想:如果我能在这些XML文件中有最新的提交SHA(作为注释),我就会知道我的实用程序的某个版本指的是哪一组XML文件。这种方法有错吗?还是应该这样做?如果是,如何将最新的提交SHA导入到我的XML文件中?(我读到$Id:$不会接受提交SHA,而是一些"blob"-SHA?)

两种选择

使用子模块

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

主回购也成为"超级模块",将1)包括主应用程序和2)应用程序的XML数据

由于Git对所有和任何基础变更集id(Git-boys,FIXME)的主repo和子模块中的变更集保持着严格的关系,因此您只能知道主应用程序的哈希,并与XML数据的此变更集快照相关

涂抹清洁过滤器

在将repos保持为完全独立的同时,您可以将跟踪数据添加到XML文件中。将任意关键字添加到Git控制的数据中的正确方法是Smudge clean filter(请参阅"关键字扩展"部分和$Date$关键字扩展的示例)

如果Git没有跟踪该XML文件,那么这没有错。我认为这是一个非常好的主意,有一个构建基于某个可见位置的哈希,所以你现在总是在出现问题时,这是基于源代码的哪个版本。

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

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

可能的解决方案是扩展主应用程序的构建过程,以便将其中一个结果打包为XML文件。此打包版本将包含有关主应用程序版本的附加信息。这种包装将方便与外部公用设施等捆绑。

在构建过程中,您可以使用git describegit rev-parse HEAD直接从git获取版本信息(请参阅将当前git提交id注入Java Web应用程序)

好吧,伙计们,根据你们的输入,我就是这么做的:

  1. 在我的XML文件中插入占位符:<!-- @GIT_VERSION@ -->
  2. 让蚂蚁获取git版本信息,注意这是Windows:
  3. 让ant在复制XML文件时将这些信息插入到我的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提交哈希

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

最新更新