Git关键字扩展或替换

Git关键字扩展或替换,git,hash,commit,keyword-expansion,Git,Hash,Commit,Keyword Expansion,在阅读了一些关于这个主题的帖子后,我意识到有相当多的反对使用关键字替换的反对意见。然而,我需要一种方法来解决以下问题,并希望有人能对如何使用git(无论是否使用关键字替换)来解决这个问题有一个想法: 我有一个主应用程序,我使用git作为VCS。这个主应用程序的一部分(一组特定的XML文件)正在被一个实用程序使用,我也使用git(单独的repo) 现在,主应用程序和实用程序有不同的发布周期,每当我发布新版本的实用程序时,我都会从主应用程序复制最新的一组XML文件。 在该实用程序中,这组XML文件是

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

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

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

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

所以我在想:如果我可以在这些XML文件中包含最新的commit SHA(作为注释),那么我总是知道我的实用程序的某个版本引用了哪一组XML文件。
这种方法有什么错误吗?或者这是一种方法吗?如果是,如何将最新的提交SHA获取到XML文件中?(我读到$Id:$不会接受commit SHA,但是一些“blob”-SHA?

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

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


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

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

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


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

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


在构建过程中,您可以使用
git descripe
git rev parse HEAD
直接从git获取版本信息(请参阅)

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

在构建过程中,您可以使用
git descripe
git rev parse HEAD
(请参阅)

两个选项直接从git获取版本信息

使用子模块

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

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

因为Git在主repo中的变更集和所有和任何基本变更集id(Git boys,FIXME)的子模块之间保持严格的关系,所以您只能知道主应用程序的散列,并与XML数据的此变更集快照相关

涂抹干净的过滤器

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

两种选择

使用子模块

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

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

因为Git在main中维护变更集之间的严格关系
<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>