5

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

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

  1. 最后修改日期
  2. 提交者的名字
  3. 可能是提交消息

他们发现在浏览代码时在文件头中查看此信息非常方便,我对此无可争辩。

我想知道的是:

有没有办法在 git commit 之前对所有暂存文件进行信息标记?换句话说,要在$Id: $提交的文件的工作副本上运行一个 perl 命令——替换为所需的信息块?

这根本不需要任何.gitattributes操作。Git 只需要知道如何合并两个这样的信息块,最好选择后一个。加盖信息只是新创建版本中的一个文件更改。

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

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

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

4

3 回答 3

3

RCS(以及 CVS)在checkout时进行扩展$Id:$等,这些不在保存的文件中。他们不可能真的是,有人可能会过来并将 version 重命名为 plain 。如果有人想知道从哪里来,那么回答得很好,比 RCS 所能提供的更多细节。它是一个本地命令,无需访问 CVS 服务器(因此在任何地方都可用,并且是即时的)。1.8.2-rc101.8.2filegit log filegit

于 2013-03-14T20:57:56.043 回答
3

git 文档关键字扩展部分解释了如何进行干净的关键字扩展。

用于扩展您想要的内容的 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 所说)这给了你什么,并且你很可能想要什么,是结帐时的字段扩展和提交时的字段删除。但效果是您的工程师将能够读取其工作目录中签出文件中的字段。这不是他们想要的吗?这不会用任何冗余元数据混淆实际版本化的内容。

于 2013-03-15T01:24:02.833 回答
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 挂钩:

    #!/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”,但将文件重命名为“keywords”:

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

  4. 编辑“关键字”,在顶部的 CONFIGURATION 部分进行更改:

    • FrauBSD 到标题
    • _FrauBSD 到 _Header

之后,每次你做一个git commit文本$Header$和/或$Header: ... $将被翻译成$Header: file YYYY-MM-DD HH:MM:SS GMTOFFSET committer $

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

于 2015-10-22T01:49:27.250 回答