把前缀?<revision-number>放到Git / Svn代码中

你怎么能把Git / Svn的前缀?v=VersionNumber有效地放到你的仓库中的每个文件上?

我发现,SO使用这个练习来给它的回购中的每个特定文件提供版本号。

他们使用SVN。 我想知道你怎么可以做同样的Git。

几个例子。

#1

 <link rel="stylesheet" href="/content/all.css?v=3959"> 

#2

 <script src="./js/question.js?v=3955" type="text/javascript"></script> 

也许你正在寻找这个:

如何为Git仓库启用identstring?

至less设置一个$ Id $是可能的,使用filter将允许你一些更多的select。

示例(不是最好的)从这个答案

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

请参阅git-attributes的手册。

“在你的仓库”? 在你的仓库直接
这将被称为“ 关键字扩展 ”,这是不build议的(正如在这个SO问题中讨论)

将元数据(版本号)放入存储在存储库中的数据中会导致合并问题 。

在SO页面中看到的是部署过程的结果,该过程从SVN(修订版)获取元数据并将其放入生成的HTML页面。

GitFaq也不推荐它。
与部署在服务器上的文件集成的SVN修订版本号相当于使用git describe ,以便在部署步骤中获得某种“提交计数”。

但直接在存储库中logging它将意味着关键字扩展关键字un扩展。


为了说明这一点,让我们来看看Linus在关于这个话题(2007年4月)的原始讨论时所说的话:

增加扩展不仅仅是“更难”。 任何一种表演都是不可能的。
认为“ git checkout newbranch ”。
并想想我们对文件(和整个子目录!)甚至没有改变。 最后,想一下像支持分支的git这样的SCM这种优化是多么的重要。

(关键字扩展所具有的基本问题(即,在没有使用“关键字”属性集检查every_single_file的情况下,切换分支基本上是不可能的)。

现在,扩张是微不足道的(这实际上和“CRLF-> LF”翻译一样:从技术上讲,这只是一个“未扩张”)。 它应该工作。

这种扩展的方式也打破了“git diff”,它基本上总是使diff 忽略关键字。 换句话说,当你这样做的时候

 git diff A..B 

并将差异发送给其他人,他们永远不会看到任何关键字!

现在,这显然满足了我的要求,如果A和B是相同的差异是空的,所以你应该期望我快乐。
但是我不高兴,因为如果其他人也在使用git,他甚至不能应用差异!
即使他在“A”,从而得到一个应该准确应用的差异,如果在未扩展的关键字周围还有其他变化(当然将在其工作树中扩展),他将会被拒绝。

看到? 关键词根本无法工作。 他们坏了。 你可以忽略它们(而不是在diff中显示它们),在这种情况下diff会被破坏,或者你不能忽略它们(并且在diff中显示它们),在这种情况下,diff 也会被破坏。

唯一的理智和可行的情况是根本没有他们。 任何关键字扩展总是会导致问题。 你根本做不到。

如果这个版本号是由一些服务器脚本 生成的:PHP,Perl,ASP.NET,Ruby on Rails( VonC 解释了为什么关键字扩展是一个坏主意 ,也就是说为什么让Git而不是Web服务器更新这样的信息是一个坏主意)那么在这个脚本中描述的只是运行git的问题。

另一个解决scheme是制作部署(构build)系统 ,将文件从版本控制系统复制到Web服务器,并embedded这些数据。 例如gitweb,用Perl编写的Git的git web界面,已经有了

 our $version = "++GIT_VERSION++"; 

由运行GIT-VERSION-GEN结果replace为构build系统( make gitweb/gitweb.cgi )。 这意味着例如运行gitweb显示在“生成器”元头中,例如:

 <meta name="generator" content="gitweb/1.6.4.rc0.22.gfc1cf.dirty git/1.6.3.2.317.g2dd3f"/> 

在你的问题中忽略“高效”这个词,你应该查找“filter驱动程序”。 插入修订和干净删除它的简单的涂抹应该做你(想你)想要的。