git是否有类似`svn propset svn:keywords`或pre-/ post-commit钩子的东西?

时间:2008-09-02 15:05:22

标签: svn git version-control

浏览git文档时,我看不到类似于SVN的提交钩子或“propset”功能的任何内容,可以说,只要提交到存储库,就可以更新文件中的版本号或版权声明。 / p>

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

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

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

这样的字符串:

$Id: expl3.dtx 780 2008-08-30 12:32:34Z morten $
无论何时提交,

都会与相关信息保持同步。

5 个答案:

答案 0 :(得分:17)

我在其他地方写了一个fairly complete answer,代码显示了如何做到这一点。摘要:

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

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

答案 1 :(得分:15)

引用Git FAQ

  

git是否有关键字扩展?

     

不推荐。关键字扩展会导致各种奇怪的问题   无论如何都不是真的有用,特别是在SCM的背景下。外   你可以使用脚本执行关键字扩展。 Linux内核导出   脚本执行此操作以在Makefile中设置EXTRA_VERSION变量。

     

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

答案 2 :(得分:4)

Git确实有预提交和提交后挂钩,它们位于每个.git / hooks目录中。只需修改文件并对它们进行chmod即可使它们可执行。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

虽然是一个古老的Q& A。我以为我会扔掉一个,因为这已经困扰了我很久了。

我习惯按逆时间顺序列出目录中的文件(搞笑我,嘿?)。原因是我希望看到我最近有哪些文件(或其他人有)。

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

这样,签出的所有文件都会带有结账的时间戳,不会反映他们上次的修改时间.....怎么这么烦人。

所以,我已经在bash中设计了一个单行代码,它将在任何文件中更新$ Date:$属性,并根据文件系统中的内容进行最后修改这样我就可以立即告知上次修改,而无需浏览git loggit show或任何其他以 blame 模式提交提交时间的工具。

以下过程将仅在将要提交给repo的跟踪文件中修改$ Date:$关键字。它使用git diff --name-only列出已修改的文件,而不是其他内容......

我在提交代码之前手动使用这个单行程序。但有一件事是我必须在应用它之前导航到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