Git关键字扩展或替代

时间:2012-03-15 12:26:44

标签: git hash commit keyword-expansion

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

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

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

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

所以我在想:如果我可以在这些XML文件中使用最新的提交SHA(作为注释),我总是知道我的实用程序的某个版本所指的XML文件集。 这种方法有什么问题,或者这是要走的路?如果是,我如何将最新的commit-SHA导入我的XML文件? (我读过$ Id:$不接受commit-SHA,但有些“blob”-SHA?)

4 个答案:

答案 0 :(得分:5)

两个选择

使用子模块

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

主要的回购也变成了“超级模块”,将1)包括主应用程序和2)应用程序的XML数据

因为Git在所有和任何base changeset-id(Git-boys,FIXME)的主repo和子模块中保持变更集之间的严格关系,所以你只能知道主应用程序的哈希值并且与XML数据的这个变更集快照相关

涂抹干净滤镜

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

好的,基于你的输入,这就是我所做的:

  1. 在我的XML文件中插入占位符:<!-- @GIT_VERSION@ -->
  2. 让蚂蚁拿起git版本信息,请注意这是Windows:
  3. 请将此信息插入我的XML文件,同时将其复制过来。
  4. 代码:

    <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>
    

    感谢您的帮助!

    另见:

    How to lookup the latest git commit hash from an ant build script

    Deriving application build version from `git describe` - how to get a relatively straightforward string?