git是否有类似`svn propset svn:keywords`或提交前/提交后钩子的东西?

git是否有类似`svn propset svn:keywords`或提交前/提交后钩子的东西?

Does git have anything like `svn propset svn:keywords` or pre-/post-commit hooks?

浏览git文档时,我看不到类似于SVN的提交钩子或"属性"功能的任何东西,例如,只要将文件提交到存储库,它们就可以更新文件中的版本号或版权声明。

是git用户被期望为这种功能编写外部脚本(这似乎不是不可能的)还是我只是想念一些明显的东西?

编辑:只是要清楚一点,例如,我对

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

像这样的字符串:

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

每当发生提交时,都会保持有关相关信息的最新信息。


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

  • 您可能不想这样做。使用git describe是合理的选择。
  • 如果确实需要执行此操作,则$Id$$Format$相当简单。
  • 任何更高级的操作都需要使用gitattributes和自定义过滤器。我提供了$Date$的示例实现。
  • 基于挂钩函数的解决方案通常无济于事,因为它们会使您的工作副本变脏。


    引用Git常见问题解答:

    Does git have keyword expansion?

    Not recommended. Keyword expansion causes all sorts of strange problems and
    isn't really useful anyway, especially within the context of an SCM. Outside
    git you may perform keyword expansion using a script. The Linux kernel export
    script does this to set the EXTRA_VERSION variable in the Makefile.

    See gitattributes(5) if you really want to do this. If your translation is not
    reversible (eg SCCS keyword expansion) this may be problematic.


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


    尽管已有很长时间的问答。我以为我会扔进去,因为这困扰了我很长一段时间。

    我习惯于按相反的时间顺序列出目录中的文件(很有趣,是吧?)。原因是我想查看最近(或其他任何人)更改过的文件。

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

    这样,所有签出的文件将带有签出的时间戳,并且不会反映出它们的最后修改时间.....多么令人讨厌。

    因此,我设计了一个bash的单行代码,它将根据文件系统上的最后修改时间来更新任何文件内的$ Date:$属性,以便我可以立即知道最近一次修改的状态无需浏览git loggit show或任何其他以非指责模式给出提交时间的工具。

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

    在提交代码之前,我会手动使用此一线代码。不过,有一件事是我必须先应用到存储库的根目录。

    这是Linux的代码变体(粘贴为多行以提高可读性)

    1
    2
    3
    4
    5
    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

    1
    2
    3
    4
    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

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


    推荐阅读

      linux命令查看包属性?

      linux命令查看包属性?,时间,系统,信息,状态,命令,文件,通讯录,管理,情况,标

      linux进入文档命令?

      linux进入文档命令?,工作,地址,图片,系统,标准,命令,信息,设备,一致,发行,Lin

      linux启动浏览器命令?

      linux启动浏览器命令?,系统,情况,发行,不了,官网,环境,工具,传播,基础,软件,

      linux默认浏览器命令?

      linux默认浏览器命令?,环境,系统,发行,工程,工具,浏览器,软件,情况,网站,管

      linux命令下载浏览器?

      linux命令下载浏览器?,软件,系统,官网,网站,工具,名称,中心,密码,时间,设计,l

      linux上传文档命令?

      linux上传文档命令?,服务,工具,密码,系统,软件,工作,电脑,综合,命令,文件,Lin

      linux如何命令建文档?

      linux如何命令建文档?,时间,名字,文件,系统,新增,命令,文件名,密码,工作,目

      linux命令关浏览器?

      linux命令关浏览器?,系统,工作,工具,咨询,信息,平台,官方网站,管理,数据,电

      linux命令打开文档?

      linux命令打开文档?,系统,软件,图片,电脑,一致,环境,名称,发行,中心,官方网

      linux剪切文档命令是?

      linux剪切文档命令是?,标准,系统,数据,文件,命令,地方,第一,位置,电子,名字,l

      linux简单的文档命令?

      linux简单的文档命令?,系统,地址,标准,工作,命令,数据,管理,时间,信息,单位,l

      linux查询文档命令?

      linux查询文档命令?,工作,地址,标准,命令,管理,信息,文件,目录,内容,终端,lin

      linux命令并行提交?

      linux命令并行提交?,地址,工作,系统,状态,暂停,信息,命令,管理,目录,控制台,L

      linux命令行浏览页面?

      linux命令行浏览页面?,系统,工具,首页,信息,密码,终端,命令,网址,数据,传播,l

      linux文档常用命令?

      linux文档常用命令?,系统,工作,地址,管理,命令,信息,基础,目录,常用命令,文

      linux内核属性命令?

      linux内核属性命令?,系统,地址,时间,信息,标准,管理,数据,工作,百分比,内核,

      linux命令文档离线版?

      linux命令文档离线版?,地址,系统,工作,标准,命令,信息,管理,文件,单位,数据,

      linux文档注释命令?

      linux文档注释命令?,地址,工作,系统,信息,标准,情况,命令,目录,注释,文件,Lin

      linux命令符浏览网页?

      linux命令符浏览网页?,系统,网络,工具,环境,首页,终端,网站,软件,密码,地址,l