2008-09-02 50 views
34

通过浏览git文档,我发现任何类似于SVN的提交钩子或“propset”功能的东西都可以,比如,只要将文件提交到存储库,就可以在文件中更新版本号或版权声明。git是否有像`svn propset svn:keywords`或pre/post-commit hooks之类的东西?

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

编辑:只是要清楚,我更感兴趣的是,例如,

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

哪里像这样的字符串:

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

保持上最新与每次提交时的相关信息。

回答

14

Git FAQ报价:

混帐是否有关键字扩展?

不推荐。关键字扩展会导致各种各样的奇怪问题,而且无论如何,特别是在SCM的上下文中并不是很有用。外部 git您可以使用脚本执行关键字扩展。 Linux内核导出 脚本执行此操作以在Makefile中设置EXTRA_VERSION变量。

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

+5

我发现这一点,使用Git项目工作相当不错的Linux代码变种(粘贴为多行以提高可读性): HTTPS ://github.com/turon/git-rcs-keywords – Mark 2013-02-20 07:04:09

2

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

4

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

18

我写了一个fairly complete answer到这个地方,代码展示了如何去做。一个总结:

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

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

1

虽然已有古老Q &答:我以为我会扔一个,因为这一直困扰着我很长一段时间。

我用来以反向时间顺序列出目录中的文件(好笑,我呢?)。原因是我想看看我有哪些文件(或其他人有)最近更改过。

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

这样所有签出的文件将带有结账的时间戳,并且不会反映他们上次修改时间.....这是多么令人讨厌。

所以,我设计在bash一行程序,将更新$日期:$财产的任何文件内部进行最后的修改,根据它有什么于文件系统这样我将有一个的时间即时状态最后修改,无需浏览git loggit show或任何其他工具,其中指定模式下的提交时间。

以下过程将仅修改将要提交到回购的跟踪文件中的$ Date:$关键字。它使用git diff --name-only这将列出被修改的文件,没有别的....

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

这里的

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 
相关问题