在这里阅读了一些关于这个主题的帖子,我意识到有一些反对使用关键字替换的缺点。不过,我需要一种方法来解决以下问题,并希望有人可能知道如何使用git解决这个问题(无论是否使用关键字替换):
我有一个主应用程序,我使用git作为VCS。这个主要应用程序的一部分(一组XML文件)正被实用程序使用,我也使用git(单独的repo)。
现在,主应用程序和实用程序具有不同的发布周期,每当我发布新版本的实用程序时,我都会从主应用程序复制最新的XML文件集。 在该实用程序中,这组XML文件是git中的非版本化内容,因此它甚至没有签入回购。
截至目前,每当我查看此实用程序的不同版本(由git管理并具有标记版本)时,我无法知道哪个“版本”(更好:提交哈希)包含的XML文件集指的是。
所以我在想:如果我可以在这些XML文件中使用最新的提交SHA(作为注释),我总是知道我的实用程序的某个版本所指的XML文件集。 这种方法有什么问题,或者这是要走的路?如果是,我如何将最新的commit-SHA导入我的XML文件? (我读过$ Id:$不接受commit-SHA,但有些“blob”-SHA?)
答案 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 describe
或git rev-parse HEAD
直接从git获取版本信息(请参阅Injecting current git commit id into Java webapp)
答案 3 :(得分:0)
好的,基于你的输入,这就是我所做的:
<!-- @GIT_VERSION@ -->
代码:
<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