【问题标题】:To put the prefix ?<revision-number> to codes by Git/SVN将前缀 ?<revision-number> 放在 Git/SVN 的代码中
【发布时间】:2010-11-10 18:16:51
【问题描述】:

如何使用 Git/SVN 将前缀 ?v=VersionNumber 有效地添加到存储库中的每个文件?

我发现 SO 使用这种做法为其 repo 中的每个特定文件提供版本号。

他们使用 SVN。我想知道如何用 Git 做同样的事情。

几个例子。

#1

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

#2

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

【问题讨论】:

  • 刚刚添加了一些cmets来回答你的cmets。
  • 添加了一条评论以回复您询问他们为什么会显示 SVN 修订号的评论。
  • 感谢您的回答,VonC!

标签: svn git version-control


【解决方案1】:

“在你的仓库”? 直接在您的存储库中?
这将被称为“关键字扩展”,不建议这样做(如SO question 中所述)

将元数据(修订号)放入存储到存储库中的数据可以lead to merge issues

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

GitFaq 也不推荐。
等效于集成到服务器上部署的文件中的 SVN 修订号将使用 git describe,以便在部署步骤期间显示某种“提交计数”。

但是直接在存储库中记录它意味着关键字扩展,关键字un扩展。


为了说明这一点,让我们看看 Linus 在最初讨论该主题时所说的话(2007 年 4 月):

添加扩展不仅仅是“更难”。基本上不可能有任何表演。
想想“git checkout newbranch”。
想想我们如何处理甚至没有改变的文件(和整个子目录!)。最后,想想优化在支持分支的 git 这样的 SCM 中的重要性。

[the] 关键字扩展存在的基本问题(即,如果不检查 every_single_file 并设置“关键字”属性,则基本上不可能进行切换。还有其他问题)。

现在,展开是微不足道的(它实际上与“CRLF->LF”翻译相同:从技术上讲,这也只是一个“展开”)。它应该工作。

这种展开的方式也破坏了“git diff”,因为它基本上总是使 diff ignore 成为关键字。换句话说,当你这样做时

git diff A..B

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

现在,这显然满足了我的要求,即如果 A 和 B 相同,则差异为空,所以你应该期望我很高兴。
但我不高兴,因为如果其他人也在使用 git,他甚至无法申请 区别!
即使他在“A”,因此得到一个应该完全应用的差异,如果围绕未扩展的关键字()有其他更改,他也会被拒绝> 当然会在他的工作树中扩展!)

看到了吗?关键字只是无法起作用。他们坏了。您可以忽略它们(并且不在差异中显示它们),在这种情况下差异被破坏,或者您不能忽略它们(并在差异中显示它们)在这种情况下差异被破坏,只是不同。

唯一合理且可行的情况是根本不拥有它们。任何关键字扩展都会总是导致问题。你根本做不到正确。

【讨论】:

  • @VonC:你的回答提出了一个问题。您使用哪个功能代替keyword expansion? --- 我从未在我的项目中使用过它。
  • 我很惊讶为什么 SO 使用keyword expansion。这背后一定有一些原因。也许,他们不使用 git-svn,这导致他们使用 keyword expansion
  • @Masi:在您的问题的上下文中,这将是“git describe”,以便获得某种技术版本号(例如,在部署阶段包含在文件中)。
  • @Masi:我的观点是:我认为 SO 根本不使用关键字扩展,而是在 php 脚本读取的文件中使用已知的 SVN 修订号并生成正确的 HTML 页面。这是一个部署后替换正确变量的问题,而不是在提交期间嵌入元数据(关键字扩展)。
  • @Masi:允许用户说:您的技术版本“SVN 修订号”Stackoverflow 网站有这样那样的问题。然后 SO 团队可以将该修订号复制​​到 SVN“BugFix”分支并开始修复错误。它是公共部署网站(“分布式”文件,未存储但生成)和内部数据(“开发”文件,存储在 SVN 存储库中)之间的链接
【解决方案2】:

如果此版本号由某些服务器脚本生成:PHP、Perl、ASP.NET、Ruby on Rails (VonC explained why keyword expansion is a bad idea,即为什么让 Git 而不是 Web 服务器更新这些信息是一个坏主意),那么在这个脚本中运行 git describe 就很简单了。

另一种解决方案是让部署(构建)系统,将文件从版本控制系统复制到网络服务器,嵌入这些数据。例如 gitweb,用 Perl 编写的 Git 的 git web 界面,有

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

被构建系统 (make gitweb/gitweb.cgi) 替换为运行 GIT-VERSION-GEN 的结果。这意味着例如运行 gitweb 会显示在“生成器”元标题中,例如:

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

【讨论】:

    【解决方案3】:

    也许你正在寻找这个:

    How do I enable ident string for Git repos?

    至少设置一个 $Id$ 是可能的,使用过滤器可以让你有更多的选择。

    来自this answer的示例(不是最好的)

    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 的手册。

    【讨论】:

    • 感谢您的回答!我在这里添加了一个示例来添加一些具体性。可能还有更好的例子。
    【解决方案4】:

    忽略问题中的“有效”一词,您应该查找“过滤器驱动程序”。插入修订的简单涂抹和删除它的清洁应该可以满足您(认为您)想要的。

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 2011-10-28
      • 2016-05-27
      • 1970-01-01
      • 2014-10-03
      • 2010-09-05
      • 1970-01-01
      • 2021-07-01
      相关资源
      最近更新 更多