如何为Git存储库启用标识字符串?

如何为Git存储库启用标识字符串?,git,ident,Git,Ident,如何在Git存储库中的文件上启用ident$Id$?您可以通过在.gittributes文件中添加一个模式来实现这一点,该模式用于您想要使用此功能的文件,然后是ident。这将在签出文件时将$Id$替换为$Id:$。但请注意,它不会像在CVS/SVN中那样为您提供文件的修订号 例如: $ echo '*.txt ident' >> .gitattributes $ echo '$Id$' > test.txt $ git commit -a -m "test" $ rm te

如何在Git存储库中的文件上启用
ident$Id$

您可以通过在
.gittributes
文件中添加一个模式来实现这一点,该模式用于您想要使用此功能的文件,然后是
ident
。这将在签出文件时将$Id$替换为$Id:$。但请注意,它不会像在CVS/SVN中那样为您提供文件的修订号

例如:

$ echo '*.txt ident' >> .gitattributes
$ echo '$Id$' > test.txt
$ git commit -a -m "test"

$ rm test.txt
$ git checkout -- test.txt
$ cat test.txt
链接到

摘要:建议在产品中嵌入版本信息的方法是使用构建系统;有关详细信息和备选方法,请参见下文


在Git中(我认为通常在其他具有原子提交的VCS系统中也是如此),没有类似于单个文件版本的东西

Git确实支持按需扩展
$Id:$
关键字,但是:

  • 仅可根据要求执行。您必须指定(可能使用globbing模式)一个文件(或一组文件)具有
    ident
    集(在树中的“.gittributes”文件中,或在本地存储库设置的“.git/info/attributes”中)
  • 它扩展到文件内容的SHA-1(或者更确切地说扩展到
    $Id:$
    )。选择此选项的原因是Git不会接触在分支切换或倒带期间未更改的文件;如果“$Id:$”扩展为修订信息,则需要更新每个受版本控制的文件,例如在切换分支时
  • Git支持大量的
    $Format:…$
    占位符,这些占位符可扩展为提交信息(例如
    $Format:%H$
    被提交哈希替换),但是:

  • 只有在其输出文件中运行时,才进行扩展
  • 它是根据请求完成的,通过
    export subst
    属性进行控制
  • 嵌入版本信息的推荐方法是通过构建系统(在构建阶段)进行嵌入;有关Git.Git存储库,请参见Git web界面中Makefile使用的Git和脚本示例


    但是,您可以(ab)使用清理/污迹过滤器驱动程序(通过
    过滤器
    属性)来获得类似CVS的关键字扩展,在签出时扩展关键字,并在将内容输入到存储库时清理它们。

    Git的标识与$Id$在其他版本控制系统中的功能不同。作为一个难题,使用RCS和git:RCS进行单独的文件修订,并使用git检查整个项目。正如我所说,这是一个难题,但它确实有点道理(有时对某些事情来说)。

    在(十多年前)中建议:

    但是,您可以(ab)使用clean/smudge过滤器驱动程序(通过过滤器属性)来获得类似CVS的关键字扩展,在签出时扩展关键字,并在将内容输入到存储库时清理关键字

    批评是(以书面形式)


    如果过滤器驱动程序真的有电源的话,它会非常棒。
    据我们所知,它似乎只获取文件名作为参数:这甚至小于
    ident
    过滤器,后者获取BLOB SHA1作为参数

    在Git 2.27(2020年第2季度)中,Git内容过滤器不再无能为力了

    Git 2.27为污点/清洁转换过滤器提供了更多信息(例如,除了已经给出的路径外,正在转换的blob出现在树的对象)

    参见,、、(2020年3月16日)和(2020年3月10日)的作者。
    (于2020年3月27日合并)

    :允许将附加元数据传递到筛选进程 签字人:brian m。卡尔森

    在各种情况下,筛选进程可以使用一些附加元数据

    例如,有些人发现ident过滤器限制太大,希望在他们的污迹文件中包含提交或分支

    此信息在签出期间不可用,因为此时HEAD尚未更新,并且在存档中也不可用

    让我们添加一种将此元数据向下传递到筛选器的方法

    我们传递正在操作的blob、treeish(如果存在commit而不是tree),以及正在操作的ref

    请注意,我们不会在所有情况下传递此信息,例如在重新规范化或执行diff时,因为在这些情况下它没有意义

    我们当前从筛选过程中获得的数据如下所示:

    command=smudge
    pathname=git.c
    0000
    
    通过此更改,我们将获得如下数据:

    command=smudge
    pathname=git.c
    refname=refs/tags/v2.25.1
    treeish=c522f061d551c9bb8684a7c3859b2ece4499b56b
    blob=7be7ad34bd053884ec48923706e70c81719a8660
    0000
    
    关于这种方法,有几点需要注意

    对于诸如签出之类的操作,treeish将始终是一个提交,因为我们无法签出单个树,但是对于其他操作,例如归档,我们最终只能在特定的树上操作,因此我们将只提供一个树作为treeish

    类似的注释也适用于refname,因为在很多情况下,我们都没有ref

    以及:

    :为筛选器提供附加元数据 签字人:brian m。卡尔森

    既然我们已经连接了代码库,可以将任何附加元数据传递给过滤器,那么让我们收集想要传递的附加元数据

    我们传递此元数据的两个主要位置是签出和归档
    在这两种情况下,读取HEAD不是一个有效的选项,因为只有在工作树被写入并且归档文件可以接受任意树之后,HEAD才会更新以进行签出

    在其他情况下,HEAD通常反映当前使用的分支的refname

    在其他情况下,我们传递的数据量较小,例如,我们实际上只能从逻辑上了解blob


    我只是在玩这个,据我所知,它只为特定文件提供SHA,而不是整个re的$Id$