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

时间:2009-11-24 20:49:30

标签: git ident

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

4 个答案:

答案 0 :(得分:39)

摘要: 在产品中嵌入版本信息的推荐方法是使用构建系统;请参阅下面的详细信息和替代方法。


在Git中(我认为通常也会在其他具有原子提交的VCS系统中)没有像版本的单个文件 这样的东西。

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

  1. 仅在请求完成。您必须指定(可能使用globbing模式)文件(或一组文件)具有ident attribute集(在树中的'.gitattributes'文件中,或'.git / info中/ attributes'用于本地存储库设置。)。
  2. 它扩展为文件内容的SHA-1 (或者更准确地说是$Id:<sha-1 of blob>$)。这种选择的原因是Git不会触摸在分支切换或倒带期间没有改变的文件;如果'$ Id:$'扩展到修订信息,则需要更新每个版本控制的文件,例如切换分支时。
  3. Git支持相当多的$Format:...$占位符,这些占位符扩展为提交信息(例如$Format:%H$替换为提交哈希)但是:

    1. 扩展仅在其输出文件中运行git archive完成。
    2. 已完成请求,通过export-subst属性进行控制。
    3. 嵌入版本信息的推荐方法是通过构建系统(在构建阶段)进行;例如,参见Git web接口中Makefile使用的Git MakefileGIT-VERSION-GEN脚本,用于git.git存储库。

      但是,您可以(ab)使用干净/涂抹过滤器驱动程序(通过filter属性)来获得类似CVS的关键字扩展,在结帐时扩展关键字,并在将内容输入存储库时清除它们。 / p>

答案 1 :(得分:16)

您可以通过在ident文件中为.gitattributes添加您想要此功能的文件的模式来执行此操作。这将在结帐时将$ Id $替换为$ Id:&lt; 40位SHA&gt; $。请注意,它不会像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

链接到gitattributes(5) Manual Page

答案 2 :(得分:2)

Git的ident不会执行$ Id $在其他版本控制系统中的功能。作为kludge,使用RCS和git:RCS进行单个文件修订,并使用git来检查项目整体。正如我所说,这是一个kludge,但它确实有意义(有时候对某些事情)。

答案 3 :(得分:1)

Jakub Narębskihis answer中建议(超过10年前):

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

批评是{Arioch 'The中的the comments

过滤器驱动程序如果真的有功能,那就太好了。
众所周知,它似乎仅以 文件名作为参数:它甚至小于ident过滤器,后者将BLOB SHA1作为参数

使用Git 2.27(2020年第二季度),git内容过滤器将不再强大!

Git 2.27为 smudge /提供了更多信息(例如,已被转换的blob出现在其中的树状对象以及路径)。干净的转化过滤器

请参见commit 0c0f8a7commit 4cf76f6commit 3f26785commit dfc8cdccommit 13e7ed6commit c397aaccommit ab90eca(2020年3月16日) ,以及commit a860476brian m. carlson (``)(2020年3月10日)。
(由Junio C Hamano -- gitster --commit 4e4baee中合并,2020年3月27日)

convert:允许将其他元数据传递给过滤进程

签名人:brian m。卡尔森

在许多情况下,筛选过程可以利用一些其他元数据。

例如,某些人发现ident过滤器限制太大,并希望将提交或分支包含在污损的文件中

该信息在结帐期间不可用,因为此时HEAD尚未更新,因此归档中也将不可用。

让我们添加一种将该元数据向下传递到过滤器的方法。

我们传递正在操作的blob,树状结构(如果存在,则优先于树进行提交)和正在操作的ref。

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

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

command=smudge
pathname=git.c
0000

通过此更改,我们将获得如下更多数据:

command=smudge
pathname=git.c
refname=refs/tags/v2.25.1
treeish=c522f061d551c9bb8684a7c3859b2ece4499b56b
blob=7be7ad34bd053884ec48923706e70c81719a8660
0000

关于此方法,需要注意几件事。

对于诸如checkout的操作,treeish将始终是一个提交,因为我们无法检出单个树,但是对于其他操作(如archive),我们最终只能对特定的树进行操作,因此我们仅提供一棵树像树一样。

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

并且:

convert:向过滤器提供其他元数据

签名人:brian m。卡尔森

现在,我们已将代码库连接起来,以将任何其他元数据传递给过滤器,让我们收集我们希望传递的其他元数据。

我们传递此元数据的两个主要地方是结帐和存档
在这两种情况下,读取HEAD都不是一个有效的选择,因为直到写入工作树并且归档文件可以接受任意树之后,HEAD才会更新以进行检出。

在其他情况下,HEAD通常会反映当前使用的分支的引用名称。

在其他情况下,例如git cat-file,我们传递的数据量较少,实际上我们只能从逻辑上了解该blob。