如何在Git存储库中的文件上启用ident $Id$
?
答案 0 :(得分:39)
摘要: 在产品中嵌入版本信息的推荐方法是使用构建系统;请参阅下面的详细信息和替代方法。
在Git中(我认为通常也会在其他具有原子提交的VCS系统中)没有像版本的单个文件 这样的东西。
Git确实支持$Id:$
关键字的按需扩展,但是:
ident
attribute集(在树中的'.gitattributes'文件中,或'.git / info中/ attributes'用于本地存储库设置。)。$Id:<sha-1 of blob>$
)。这种选择的原因是Git不会触摸在分支切换或倒带期间没有改变的文件;如果'$ Id:$'扩展到修订信息,则需要更新每个版本控制的文件,例如切换分支时。 Git支持相当多的$Format:...$
占位符,这些占位符扩展为提交信息(例如$Format:%H$
替换为提交哈希)但是:
export-subst
属性进行控制。嵌入版本信息的推荐方法是通过构建系统(在构建阶段)进行;例如,参见Git web接口中Makefile使用的Git Makefile和GIT-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
答案 2 :(得分:2)
Git的ident不会执行$ Id $在其他版本控制系统中的功能。作为kludge,使用RCS和git:RCS进行单个文件修订,并使用git来检查项目整体。正如我所说,这是一个kludge,但它确实有意义(有时候对某些事情)。
答案 3 :(得分:1)
Jakub Narębski在his answer中建议(超过10年前):
但是,您可以(通过过滤器属性)使用清理/涂抹过滤器驱动程序来获得类似于CVS的关键字扩展,在结帐时扩展关键字,并在将内容输入到存储库时清理它们。
批评是{Arioch 'The中的the comments)
过滤器驱动程序如果真的有功能,那就太好了。
众所周知,它似乎仅以 文件名作为参数:它甚至小于ident
过滤器,后者将BLOB SHA1作为参数。
使用Git 2.27(2020年第二季度),git内容过滤器将不再强大!
Git 2.27为 smudge /提供了更多信息(例如,已被转换的blob出现在其中的树状对象以及路径)。干净的转化过滤器。
请参见commit 0c0f8a7,commit 4cf76f6,commit 3f26785,commit dfc8cdc,commit 13e7ed6,commit c397aac,commit ab90eca(2020年3月16日) ,以及commit a860476的brian 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。