我计划将公司从CVS过渡到Git,并且某些工程师希望我们仍然使用CVS关键字字符串,例如$Id: $
。我已经阅读了所有关于使用 ident 设置.gitattributes
实现此功能的内容,我理解为什么它不合适,尽管可能是较小的源树。 (我们的来源是巨大的,所以我认为这是不可能的。)
我们的工程师并不特别关心在文件中使用SHA1哈希。他们只是想知道:
他们发现在浏览代码时在文件头中看到此信息非常方便,我无法与之争辩。
我想知道的是:
有没有办法在git commit之前给所有暂存的文件添加信息?换句话说,在正在提交的文件的工作副本上运行perl命令 - 用一块所需信息替换$Id: $
?
这根本不需要任何.gitattributes
个动作。 Git只需要知道如何合并两个这样的信息块,理想情况是选择后者。标记的信息只是新创建的版本中的一个文件更改。
我在预提交钩子中看到了这样做,但似乎有不同的意图 - 不是为了编辑文件,只是为了检查它们。我是对的吗?
没人试过这种方法吗?对我来说似乎比每次git更改版本时尝试过滤所有源文件更简单,这听起来像.gitattributes
那样。
非常感谢任何建议/警告/指示。
答案 0 :(得分:3)
RCS(以及CVS)在 checkout 上进行$Id:$
等扩展,这些不在保存的文件中。它们实际上并非如此,有人可能会将版本1.8.2-rc10
重命名为普通1.8.2
。如果有人想知道file
来自何处,git log file
可以很好地回答,更多详细信息比RCS所能提供的更多。它是一个本地命令,没有访问CVS服务器(因此可以在git
所在的任何地方使用,并且是即时的)。
答案 1 :(得分:3)
Keyword Expansion的git 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)
这就是你解决这个问题的方法:
添加以下预提交挂钩:
#!/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 --
添加以下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 --
下载“.filters / fraubsd-keywords”,但将文件重命名为“关键字”:
https://raw.githubusercontent.com/freebsdfrau/FrauBSD/master/.filters/fraubsd-keywords
修改“关键字”,在顶部的配置部分进行更改:
在此之后,每次执行git commit
时,文字$Header$
和/或$Header: ... $
都会被翻译为$Header: file YYYY-MM-DD HH:MM:SS GMTOFFSET committer $
注意:您可能必须修改“关键字”脚本的一小部分,以便对或多或少类型的文件进行操作。在撰写本文时,它仅对“ASCII文本”或“shell脚本”文件进行操作。