从CVS转到git:$ Id:$ equivalent?

我读了一堆关于简单的源代码控制工具的问题,git看起来像是一个合理的select。 我已经运行起来,迄今为止效果很好。 我喜欢CVS的一个方面是版本号的自动增量。

我明白,这在分布式存储库中的意义不大,但作为开发人员,我想要/需要这样的东西。 让我解释一下为什么:

我使用Emacs。 我会定期查看第三方软件包的lisp源文件的新版本。 说我有一个文件foo.el根据标题是1.3版本; 如果我查看最新版本,看看它是1.143还是2.6,那么我知道我还远远落后。 相反,如果我看到几个40字符的哈希值,我不知道后面是什么,或者知道后面有多less。 我绝对会恨,如果我不得不手动检查ChangeLogs只是为了了解如何过时的我。

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

那么我有什么替代scheme? 如果我无法获得$ Id:$的等价物,我还能如何提供我正在寻找的东西? 谢谢您的帮助!

编辑:我应该提到,我的期望是,最终用户将不会有git安装,即使他们这样做,将不会有一个本地存储库(实际上,我希望不会这样)。 感谢迄今为止的答案!

SHA只是一个版本的表示(虽然是规范的)。 git describe命令提供了其他的function,而且做的很好。

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

 2.2-16-gc0cd61a 

这说明了两件重要的事情:

  1. 自2.2以来,这棵树已经有了16次提交
  2. 确切的源代码树可以显示在其他人的克隆上。

比方说,例如,您打包了一个带有源代码的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. 

现在在Git中支持$ Id:$。 要启用文件自述文件,您可以将“自述文件标识”放入.gitattributes文件中 。 文件名上的通配符被支持。 有关详细信息,请参阅man gitattributes 。

这不是OP的无理要求。

我的用例是:

  1. 我用自己的个人代码使用git,因此没有与他人合作。
  2. 我将系统Bash脚本保存在那里,当它们准备就绪时,它们可能会进入/ usr / local / bin。

我使用3个独立的机器与它相同的git回购。 这将是很好的知道什么“版本”的文件,我目前在/ usr /本地/斌,而不必做一个手动的“diff -u

对于那些你是负面的,请记住还有其他的用例。 并不是每个人都使用git来协同工作,git仓库中的文件就是他们的“最终”位置。

无论如何,我做的方式是在回购中创build一个属性文件,如下所示:

 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仓库的identstring?

不知道这将永远在Git中。 引用Linus的话 :

“关键字replace的整个概念只是完全愚蠢的,如果你想要在释放树形目标等时使用它,那么在实际内容跟踪之外做”外部“是微不足道的。

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

编辑:你应该写或使用别人的脚本,当然,这不是手动。

正如我之前写的:

自动生成显示合理版本号的Id标签是不可能的,因为每个人的发展路线都可以与所有其他人不同。 所以有人可以参考一个文件的版本“1.41”,但是该文件的版本“1.41”是不同的。

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

如果有$关键字$对你来说是必不可less的,那么也许你可以尝试看一下Mercurial ? 它有一个hgkeyword扩展,实现你想要的。 无论如何,Mercurial作为一个DVCS是有趣的。

用git仓库做的事情就是使用tag对象。 这可以用来标记任何types的string提交,可以用来标记版本。 你可以用git tag命令在repo中看到这个标签,它将返回所有的标签。

检查标签很容易。 例如,如果有一个标签v1.1你可以检查这个标签到这样的分支:

 git checkout -b v1.1 

由于它是顶级对象,因此您可以看到整个提交历史logging,还可以运行差异,进行更改和合并。

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

我有同样的问题。 需要一个比散列string更简单的版本,并且不需要连接到存储库就可以使用该工具。

我做了一个git预先提交钩子,并改变我的脚本能够自动更新自己。

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

我的是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中创build一个可执行脚本。

脚本只是改变到git目录的头部,并用-updateVersion调用脚本

每次我登记,MYVERSIONvariables都会根据提交的数量进行更新。

如果你只是希望人们能够了解一个有多远的想法,git可以通过几种相当简单的方式告诉他们。 例如,他们比较最后一次在主干和主干上提交的date。 他们可以使用git樱桃来查看在你的行李箱中发生了多less没有出现在他们身上的提交。

如果这就是你想要的,我会寻找一种方法来提供它没有版本号。

另外,除非你确定他们想要,否则我不打扰任何人。 🙂

如果我理解正确,基本上,您想知道自上次更新以来在给定文件上发生了多less次提交。

首先获取远程原点的更改,但不要将它们合并到master分支中:

 % git fetch 

然后获取master分支和远程origin/master之间给定文件上发生的更改日志。

 % git log master..origin/master foo.el 

这会为您提供自上次将origin/master合并到master发生在远程存储库中的所有提交的日志消息。

如果你只是想要一个更改的计数, wcwc 。 说,像这样:

 % git rev-list master..origin/master foo.el | wc -l 

我同意那些认为令牌replace属于构build工具而不是版本控制工具的人。

您应该使用一些自动发布工具来设置版本标签发布时的版本ID。

既然你使用emacs,你可能会很幸运:)

我碰巧碰到过这个问题,而且几天前我刚刚来到Lively ,这个emacs软件包允许在你的文档中生动地生动一些emacs。 我没有试图说实话,但是当我读到这个时,就想到了。

对于单个文件项目,RCS ID很好,但对于任何其他的$ Id $,都没有提到项目(除非你强制将虚拟签入放到一个虚拟版本文件中)。 仍然有人可能会感兴趣如何获得在每个文件级别或在提交级别的$ Author $,$ Date $,$ Revision $,$ RCSfile $等价物(如何把它们放在一些关键字是另一个题)。 我没有对这些问题的答案,但看到更新这些的要求,特别是当文件(现在在Git中)起源于RCS兼容系统(CVS)时。 如果源代码是从任何Git仓库分开发布的(这也是我所做的),这样的关键字可能会很有趣。 我的解决scheme是这样的:每个项目都有一个自己的目录,在项目roor中,我有一个名为.version (单个单词)的文本文件,描述当前版本(导出源时将使用的名称)。

在为下一个版本工作时,脚本.version数字,一些git版本描述符(如git describe )和.build (加上主机和date)中的单调内部.version号提取到自动生成的源文件程序,所以你可以从什么来源和何时build立。

我在单独的分支中开发了新的function,我要做的第一件事就是向.versionstring添加n (用于“下一个”)(源自同一个根的多个分支将使用相同的临时.version数字)。 在发布之前,我决定要合并哪个分支(希望所有的分支都是.version )。 在提交合并之前,我将.version更新为下一个数字(主要或次要更新,具体取决于合并的function)。