Git中不同的ident-style字符串方法?

时间:2013-03-14 20:08:45

标签: git cvs checkin ident

我计划将公司从CVS过渡到Git,并且某些工程师希望我们仍然使用CVS关键字字符串,例如$Id: $。我已经阅读了所有关于使用 ident 设置.gitattributes实现此功能的内容,我理解为什么它不合适,尽管可能是较小的源树。 (我们的来源是巨大的,所以我认为这是不可能的。)

我们的工程师并不特别关心在文件中使用SHA1哈希。他们只是想知道:

  1. 上次修改日期
  2. 提交者的姓名
  3. 可能是提交消息
  4. 他们发现在浏览代码时在文件头中看到此信息非常方便,我无法与之争辩。

    我想知道的是:

    有没有办法在git commit之前给所有暂存的文件添加信息?换句话说,在正在提交的文件的工作副本上运行perl命令 - 用一块所需信息替换$Id: $

    这根本不需要任何.gitattributes个动作。 Git只需要知道如何合并两个这样的信息块,理想情况是选择后者。标记的信息只是新创建的版本中的一个文件更改。

    我在预提交钩子中看到了这样做,但似乎有不同的意图 - 不是为了编辑文件,只是为了检查它们。我是对的吗?

    没人试过这种方法吗?对我来说似乎比每次git更改版本时尝试过滤所有源文件更简单,这听起来像.gitattributes那样。

    非常感谢任何建议/警告/指示。

3 个答案:

答案 0 :(得分:3)

RCS(以及CVS)在 checkout 上进行$Id:$等扩展,这些不在保存的文件中。它们实际上并非如此,有人可能会将版本1.8.2-rc10重命名为普通1.8.2。如果有人想知道file来自何处,git log file可以很好地回答,更多详细信息比RCS所能提供的更多。它是一个本地命令,没有访问CVS服务器(因此可以在git所在的任何地方使用,并且是即时的)。

答案 1 :(得分:3)

Keyword Expansiongit documentation部分介绍了如何进行干净的关键字扩展。

用于扩展您想要的内容的ruby脚本将是这样的(未经测试)

#! /usr/bin/env ruby
data = STDIN.read
last_info = `git log --pretty=format:"%ad %cn %s" -1`
puts data.gsub('$Last$', '$Last: ' + last_info.to_s + '$')

设置过滤器

$ git config filter.last_expander.smudge expand_last_info
$ git config filter.last_expander.clean 'perl -pe "s/\\\$Last[^\\\$]*\\\$/\\\$Last\\\$/"'

设置.gitattributes

echo '*.txt filter=last_expander' >> .gitattributes

注意:(正如vonbrand所说)这给你带来了什么,以及你可能想要的是 checkout 上的字段扩展以及提交时删除字段。但结果是,您的工程师将能够在其工作目录中的已检出文件中读取该字段。这不是他们想要的吗?这不会弄乱实际版本化内容与任何冗余元数据。

答案 2 :(得分:0)

这就是你解决这个问题的方法:

  1. 添加以下预提交挂钩:

    #!/bin/sh
    git diff --cached --name-only -z --diff-filter=ACM |
            xargs -r0 .filters/keywords --
    git diff --cached --name-only -z --diff-filter=ACM |
            xargs -r0 git add -u -v --
    
  2. 添加以下commit-msg hook:

    #!/bin/sh
    awk '!/^[[:space:]]*(#|$)/{exit f++}END{exit !f}' "$1" && exit
    # NOTREACHED unless commit was aborted
    git diff --cached --name-only -z --diff-filter=ACM |
            xargs -r0 .filters/keywords -d --
    git diff --cached --name-only -z --diff-filter=ACM |
            xargs -r0 git add -u -v --
    
  3. 下载“.filters / fraubsd-keywords”,但将文件重命名为“关键字”:

    https://raw.githubusercontent.com/freebsdfrau/FrauBSD/master/.filters/fraubsd-keywords

  4. 修改“关键字”,在顶部的配置部分进行更改:

    • FrauBSD to Header
    • _FrauBSD to _Header
  5. 在此之后,每次执行git commit时,文字$Header$和/或$Header: ... $都会被翻译为$Header: file YYYY-MM-DD HH:MM:SS GMTOFFSET committer $

    注意:您可能必须修改“关键字”脚本的一小部分,以便对或多或少类型的文件进行操作。在撰写本文时,它仅对“ASCII文本”或“shell脚本”文件进行操作。