要添加前缀?<;修订编号>;通过Git/SVN进行代码转换

要添加前缀?<;修订编号>;通过Git/SVN进行代码转换,svn,git,version-control,Svn,Git,Version Control,如何使用Git/SVN有效地将前缀?v=VersionNumber放入存储库中的每个文件? 我发现SO使用Practice为其repo中的每个特定文件提供版本号 他们使用SVN。我想知道如何使用Git实现同样的功能 几个例子。 #1 #2 “在您的存储库中”?直接访问您的存储库? 这将被称为“关键字扩展”,不建议这样做(如本文所述) 将元数据(修订号)放入存储在存储库中的数据可以 您在SO页面中看到的是部署过程的结果,该过程从SVN(修订版)获取元数据并将其放入生成的HTML页面中 也不推

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

我发现SO使用Practice为其repo中的每个特定文件提供版本号

他们使用SVN。我想知道如何使用Git实现同样的功能

几个例子。

#1

#2

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

将元数据(修订号)放入存储在存储库中的数据可以

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

也不推荐。
为了在部署步骤中显示某种类型的“提交计数”,将使用与集成到服务器上部署的文件中的SVN修订号等效的版本号

但是,将其直接记录在存储库中意味着关键字扩展和关键字未扩展


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

增加扩张不仅仅是“更难”。基本上不可能有任何形式的表演。
想想“
git checkout newbranch

想想我们如何处理那些甚至没有改变的文件(和整个子目录!)。最后,考虑一下这种优化在支持分支的类似SCM的git中有多么重要

[关键词扩展存在的基本问题(即切换分支基本上不可能在不签出每个带有“关键词”属性集的\u单个\u文件的情况下进行。还有其他问题)

现在,unexpansion很简单(它实际上与“CRLF->LF”翻译相同:从技术上讲,这实际上也是一个“unexpansion”)。它应该会起作用

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

然后将差异发送给其他人,他们根本看不到任何关键字

现在,这显然满足了我的要求,即如果A和B相同,则diff为空,因此您应该期望我感到高兴。
但我不高兴,因为如果其他人也在使用git,他甚至不能申请 差别
即使他处于“A”,因此得到了一个应该准确应用的差异,如果未扩展关键字周围有其他更改,他也会被拒绝(当然,他将在他的工作树中扩展该关键字!)

看到了吗?关键词根本无法工作。它们坏了。您可以忽略它们(不在差异中显示),在这种情况下差异被破坏,或者您不能忽略它们(在差异中显示),在这种情况下差异也被破坏,只是方式不同而已

唯一明智和可行的情况是根本没有它们。任何关键字扩展都会导致问题。你根本做不好


如果这个版本号是由一些服务器脚本(PHP、Perl、ASP.NET、Ruby on Rails)生成的(即为什么让Git而不是web服务器更新这些信息是个坏主意),那么只需在这个脚本中运行即可

另一个解决方案是使部署(构建)系统(将文件从版本控制系统复制到web服务器)嵌入此数据。例如,gitweb,用Perl编写的git的gitweb接口

our $version = "++GIT_VERSION++";
由运行
GIT-VERSION-GEN
的结果替换为生成系统(
make gitweb/gitweb.cgi
)。这意味着,例如,运行gitweb会在“generator”元标题中显示,例如:

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

忽略问题中的“高效”一词,您应该查找“过滤器驱动程序”。插入修订版的简单污迹和删除修订版的干净污迹应该可以满足您(认为您)的需要。

也许您正在寻找:

至少设置$Id$是可能的,使用过滤器将允许您使用更多选项

示例(不是最佳示例)


请参阅手册。

@VonC:您的回答提出了一个问题。您使用哪种功能来代替关键字扩展我从来没有在我的项目中使用过它。我很惊讶为什么如此使用
关键字扩展
。这背后一定有一些原因。也许,他们没有使用git svn,这会导致他们使用
关键字扩展
@Masi:在你的问题的上下文中,这将是“git descripe”,以便获得某种技术版本号(例如,在部署阶段包含到文件中)。@Masi:我的观点是:我不认为这样使用关键字扩展,而是在php脚本读取的文件中使用已知的SVN修订号并生成正确的HTML页面。这是一个在部署后替换正确变量的问题,而不是在提交期间嵌入元数据(关键字扩展)。@Masi:允许用户说:您的技术版本“SVN修订号”Stackoverflow网站存在这样或那样的问题。然后,团队就可以将修订号复制到SVN“BugFix”分支中,并开始修复bug。它是公共部署网站(“分布式”文件,未存储,但已生成)和内部数据(“开发”文件,存储在SVN repo中)之间的链接,刚刚添加了一些评论以回答您的评论。添加了一条评论以回应您的评论,询问为什么会显示SVN修订号。感谢您的回答,VonC!谢谢你的回答!我在这里添加了一个示例来添加一些具体化。也许,更好的例子也存在于此。
git diff A..B
our $version = "++GIT_VERSION++";
<meta name="generator" content="gitweb/1.6.4.rc0.22.gfc1cf.dirty git/1.6.3.2.317.g2dd3f"/>
echo '*.txt ident' >> .gitattributes
echo '$Id$' > test.txt
git commit -a -m "test"

rm test.txt
git checkout -- test.txt
cat test.txt