39

浏览 git 文档,我看不到任何类似于 SVN 的提交挂钩或“propset”功能的东西,例如,只要文件提交到存储库,就可以更新文件中的版本号或版权声明。

git 用户是否希望为这种功能编写外部脚本(这似乎不是不可能的)或者我只是错过了一些明显的东西?

编辑:为了清楚起见,我更感兴趣,例如,

svn propset svn:keywords "Author Date Id Revision" expl3.dtx

像这样的字符串:

$Id: expl3.dtx 780 2008-08-30 12:32:34Z morten $

每当发生提交时,都会与相关信息保持同步。

4

5 回答 5

18

我在别处写了一个相当完整的答案,代码显示了如何做到这一点。总结:

  1. 你可能不想这样做。使用git describe是一个合理的选择。
  2. 如果您确实需要这样做,$Id$并且$Format$相当容易。
  3. 任何更高级的东西都需要使用gitattributes和自定义过滤器。我提供了一个示例实现$Date$

基于钩子函数的解决方案通常没有帮助,因为它们会使您的工作副本变脏。

于 2008-09-17T01:19:47.327 回答
14

引用Git 常见问题解答

git有关键字扩展吗?

不建议。关键字扩展会导致各种奇怪的问题,而且无论如何都不是真正有用的,尤其是在 SCM 的上下文中。在 git 之外,您可以使用脚本执行关键字扩展。Linux 内核导出脚本执行此操作以在 Makefile 中设置 EXTRA_VERSION 变量。

如果你真的想这样做,请参阅 gitattributes(5)。如果您的翻译不可逆(例如 SCCS 关键字扩展),这可能会有问题。

于 2008-09-02T16:25:27.917 回答
4

Git 确实有 pre-commit 和 post-commit 钩子,它们位于每个 .git/hooks 目录中。只需修改文件并 chmod 使其可执行。

于 2008-09-02T16:36:09.933 回答
2

虽然是一个古老的问答。我想我会扔一个,因为这已经困扰了我很长时间。

我习惯于按逆时间顺序列出目录中的文件(有趣的是,嘿?)。原因是我想看看我(或其他任何人)最近更改了哪些文件。

Git 会打乱我的计划,因为在切换分支时,本地 repo 将完全覆盖来自打包本地 repo 中的(增量......我知道......)副本中的跟踪文件。

这样,所有签出的文件都将带有签出的时间戳,并且不会反映它们的最后修改时间......真烦人。

因此,我在 bash 中设计了一个单行,它将根据文件系统上的内容更新任何文件中的 $Date:$ 属性,以便我将立即知道上次修改的状态无需浏览git log, 或任何其他在责备模式下git show提供提交时间的工具。

以下过程将仅在将提交到 repo 的跟踪文件中修改 $Date: $ 关键字。它使用git diff --name-onlywhich 将列出已修改的文件,仅此而已....

在提交代码之前,我手动使用了这个单行代码。但有一件事是我必须在应用它之前导航到 repo 的根目录。

这是 Linux 的代码变体(为了便于阅读,粘贴为多行)

git diff --name-only | xargs stat -c "%n %Y" 2>/dev/null | \
perl -pe 's/[^[:ascii:]]//g;' | while read l; do \
   set -- $l; f=$1;  shift; d=$*; modif=`date -d "@$d"`; \
   perl -i.bak -pe 's/\$Date: [\w \d\/:,.)(+-]*\$/\$Date: '"$modif"'\$/i' $f; \
   git add $f; done

和 OSX

git diff --name-only | xargs stat -f "%N %Sm" | while read l; do \
   set -- $l; f=$1; shift; d=$*; modif=`date -j -f "%b %d %T %Y" "$d"`; \
   perl -i.bak -pe 's/\$Date: [\w \d\/:,.)(+-]*\$/\$Date: '"$modif"'\$/i' $f; \
   git add $f; done
于 2017-01-23T21:13:21.413 回答
1

也许最常见的 SVN 属性“svn:ignore”是通过 .gitignore 文件完成的,而不是元数据。恐怕我对其他类型的元数据没有任何帮助。

于 2008-09-02T15:10:51.667 回答