当前位置:  开发笔记 > 编程语言 > 正文

从CVS转到Git:$ Id:$等价?

如何解决《从CVS转到Git:$Id:$等价?》经验,为你挑选了8个好方法。

我阅读了一堆关于简单源代码控制工具的问题,而Git似乎是一个合理的选择.我已经启动并运行,到目前为止它运行良好.我喜欢CVS的一个方面是自动增加版本号.

我理解这在分布式存储库中没有多大意义,但作为开发人员,我希望/需要这样的东西.让我解释一下原因:

我用Emacs.我会定期查找第三方软件包的新版Lisp源文件.假设我有一个文件foo.el,根据标题,它是版本1.3; 如果我查看最新版本并看到它是1.143或2.6或其他什么,我知道我已经远远落后了.

如果相反我看到了几个40个字符的哈希值,我不知道哪个是后来的,或者不知道它有多晚.如果我不得不手动检查ChangeLogs以了解我是如何过时的,我会非常讨厌它.

作为一名开发人员,我希望将这种礼貌扩展到使用我的输出的人(也许我在开玩笑说,任何人都是,但让我们暂时搁置一下).我不想记得每次都自己增加该死的号码,或者时间戳或类似的东西.那是一个真正的PITA,我从经验中知道.

那么我有什么替代品?如果我不能得到$ Id:$等价物,我还能提供我想要的东西吗?

我应该提一下,我的期望是最终用户不会安装Git,即使他们这样做,也不会有本地存储库(事实上,我希望不会以这种方式提供它).



1> Dustin..:

SHA只是版本的一种表示(尽管是规范的).该git describe命令提供了其他人,并且做得很好.

例如,当我git describe在我的Java memcached客户端源的主分支中运行时,我得到:

2.2-16-gc0cd61a

这说两件重要的事情:

    自2.2以来,这棵树中确实有16次提交

    精确的源树可以在任何人的克隆显示.

比方说,例如,您version使用源打包了一个文件(或者甚至重写了所有要分发的内容)以显示该数字.假设打包版本是2.2-12-g6c4ae7a(不是发行版,而是有效版本).

现在,您可以看到究竟有多远后面你(4次提交),并且你可以清楚地看到这4个提交:

# The RHS of the .. can be origin/master or empty, or whatever you want.
% git log --pretty=format:"%h %an %s" 2.2-12-g6c4ae7a..2.2-16-gc0cd61a
c0cd61a Dustin Sallings More tries to get a timeout.
8c489ff Dustin Sallings Made the timeout test run on every protocol on every bui
fb326d5 Dustin Sallings Added a test for bug 35.
fba04e9 Valeri Felberg Support passing an expiration date into CAS operations.



2> 小智..:

到目前为止,Git支持$ Id:$.要为文件README启用它,您可以将"README ident"放入.gitattributes.支持文件名上的通配符.有关详细信息,请参阅man gitattributes.


这将为您提供blob的sha1,但不提供提交的sha1.有用,只是不作为提交的标识符.
git没有任何关键字扩展机制,如提到的`$ Id $`.存储的内容正是您所获得的.在任何情况下,版本都属于构成提交的完整文件集合,而不是特定于一个文件(这个想法是RCS时代的遗留物,或者也许SCCS应该归咎于此......因为CVS只是一个荣获RCS的荣耀前沿,SVN试图成为一个CVS工作,它卡住了.)

3> 小智..:

这不是OP的无理要求.

我的用例是:

    我使用Git作为我自己的个人代码,因此没有与他人合作.

    我将系统Bash脚本保留在那里,/usr/local/bin当它们准备就绪时可能会进入.

我使用三台具有相同Git存储库的独立机器.如果不知道/usr/local/bin手册"diff -u 中的版本",我很高兴知道我当前所处文件的"版本".

对于那些你消极的人,请记住还有其他用例.不是每个人都使用Git进行协作,将Git存储库中的文件作为其"最终"位置.

无论如何,我这样做的方式是在存储库中创建一个属性文件,如下所示:

cat .git/info/attributes
# see man gitattributes
*.sh ident
*.pl ident
*.cgi ident

然后把$ Id $放在文件的某个地方(我喜欢把它放在shebang之后).

提交.请注意,这不会像我预期的那样自动进行扩展.例如,您必须重新处理该文件

git commit foo.sh
rm foo.sh
git co foo.sh

然后你会看到扩展,例如:

$ head foo.sh
#!/bin/sh

# $Id: e184834e6757aac77fd0f71344934b1cd774e6d4 $

一些好的信息在如何为Git存储库启用ident字符串?.


应该注意的是,这确实标识了当前的*file*(blob),而不是当前的提交
什么是`git co`应该做什么?我收到错误消息"`git:'co'不是git命令.请参阅'git --help'."应该是[它是`git checkout`](/sf/ask/17360801/如何对别名git的结帐到的git-CO)?

4> orip..:

不确定这将永远在Git中.要引用莱纳斯:

"关键字替换的整个概念只是完全愚蠢.如果你想在释放树作为tar-ball等时想要它,那么在实际内容跟踪之外"做"是微不足道的."

但是,检查日志非常容易 - 如果您正在跟踪foo.el的稳定分支,您可以看到稳定分支日志中的新提交不在本地副本中.如果要模拟CVS的内部版本号,可以比较上次提交的时间戳.

编辑:您应该为此编写或使用其他人的脚本,当然,不要手动执行此操作.


是的,我阅读了关于关键字扩展的一长串电子邮件的一部分.Linus的态度几乎足以让我彻底摆脱git.
是的,有时他缺乏礼貌,但他通常是正确的,他肯定是关键词扩展的主题.
与Richard Stallman相比,他非常开心.
Linus只评论了关键字扩展的一个方面 - 发布跟踪.但这不是它的唯一目的.这句话清楚地表明了一个人的态度,但没有说明这个问题.典型的"以高举的方式表现出明显的"政治伎俩,而人群则属于你.问题在于人群的定义是愚蠢的,因为它只有一个大脑.这清楚地解释了git和关键字扩展的情况.一个白痴说"不",每个人都欢呼!

5> Bombe..:

正如我写之前:

自动生成显示合理版本号的Id标签对于像Bazaar这样的DSCM工具是不可能的,因为每个人的开发线都可能与其他开发线不同.所以有人可以参考文件的版本"1.41",但该文件的版本"1.41"是不同的.

基本上,$ Id $对Bazaar,Git和其他分布式源代码管理工具没有任何意义.


只是吐出哈希而不是"版本号"有什么问题?我想要内部脚本上的日志语句,调试网页和"--version"选项,这些选项很容易告诉我哪些修订版本在哪里运行,因此我可以检查该特定的哈希,看看它的行为方式.它简化了已部署应用程序的管理....我不想要一些提交挂钩,它认为每个提交都是对其中包含$ Id $标记的每个文件的更改.
是的,我在发布之前就读到了,这就是为什么我要求对底层问题采取更一般的解决方案.我认为单个文件拥有版本#的愿望是合法的,因为git无法提供解决方案.
@Brian - 根据OP的编辑,最终用户想知道版本号,但无法访问git或git日志.在这种情况下,散列是无意义的数字,而不是版本号.DSCM在解决此需求方面没有提供任何帮助.

6> David Ljung ..:

我有同样的问题.我需要一个比哈希字符串更简单的版本,并且可供使用该工具的人使用而无需连接到存储库.

我用Git预提交钩子做了它并改变了我的脚本以便能够自动更新自己.

我根据完成的提交数量来确定版本.这是一个轻微的竞争条件,因为两个人可以同时提交,并且都认为他们提交相同的版本号,但我们在这个项目上没有很多开发人员.

我的是Ruby,但它并不是非常复杂的代码.Ruby脚本具有:

MYVERSION = '1.090'
## Call script to do updateVersion from .git/hooks/pre-commit
def updateVersion
  # We add 1 because the next commit is probably one more - though this is a race
  commits = %x[git log #{$0} | grep '^commit ' | wc -l].to_i + 1
  vers = "1.%0.3d" % commits

  t = File.read($0)
  t.gsub!(/^MYVERSION = '(.*)'$/, "MYVERSION = '#{vers}'")
  bak = $0+'.bak'
  File.open(bak,'w') { |f| f.puts t }
  perm = File.stat($0).mode & 0xfff
  File.rename(bak,$0)
  File.chmod(perm,$0)
  exit
end

然后我有一个命令行选项(-updateVersion)调用该工具的updateVersion.

最后,我转到Git头并创建一个可执行脚本.git/hooks/pre-commit.

该脚本只需更改为Git目录的头部并调用我的脚本-updateVersion.

每次我签入时,MYVERSION变量都会根据提交的数量进行更新.



7> Abizern..:

使用Git存储库完成的任务是使用该tag对象.这可用于使用任何类型的字符串标记提交,并可用于标记版本.您可以使用git tag命令在存储库中查看该标记,该命令将返回所有标记.

检查标签很容易.例如,如果有标记,v1.1您可以检查该标记到这样的分支:

git checkout -b v1.1

由于它是顶级对象,您将看到该提交的整个历史记录,以及能够运行差异,进行更改和合并.

不仅如此,标签仍然存在,即使它所在的分支已被删除而未被合并回主线.


那么,是否有一种方法可以通过git自动将此标记插入到文件中?谢谢!

8> Keltia..:

如果拥有$ Keywords $对你来说是必不可少的,那么也许你可以试着看看Mercurial呢?它有一个hgkeyword扩展,可以实现你想要的.无论如何,Mercurial作为DVCS很有意思.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有