如何将Git提交日期插入正在提交的文件中?

5

我正在处理一个任务,需要将git提交日期写入其中一个被提交的文件中。我需要在以下情况下发生:

  • 当分支被推送到远程repo时
  • 合并到主分支时

具体而言,更改应如下所示:

提交之前:private String DATE="$DATE$"

提交后:private String DATE="$DATE: 2020-05-08 18:19:25 $"

以下是我目前尝试过的方法:

我按照 https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes#Keyword-Expansion 中的指导,将.gitattributes、.gitconfig、.git_filters(包括smudge和clean过滤器)添加到我的项目中。

下面是我在项目中配置的内容:

  • .gitConfig:
    clean  = .git_filters/dater.clean
    smudge = .git_filters/dater.smudge %f 
  • .gitAttributes:
*.java filter=dater 

  • .git_filters:(在父版本库下创建了单独的文件夹)
dater.clean:

#!/usr/bin/sh

sed s/$Date$/`date +%Y%m%d`/g 


dater.smudge:

#! /usr/bin/env ruby
data = STDIN.read
last_date = `git log --pretty=format:"%ad" -1`
puts data.gsub('$Date$', '$Date: ' + last_date.to_s + '$')

当我尝试使用以上配置时,它不起作用。正在寻求帮助以解决此问题,请。


欢迎来到 [so]。标题中提到了 java,但问题标记为 [tag:shell],但我在问题描述中没有看到任何与 Java 或 Shell 相关的内容。我现在将删除 shell 标签,请添加相关标签并修复标题。 - oguz ismail
我不完全理解你的问题,但是你尝试过使用Git钩子吗? - symlink
@symlink 我认为git钩子是解决问题的方法。虽然这个问题有一定的先后顺序,除非提交日期不需要精确。或者git钩子可以绕过这个问题吗? - Inigo
1个回答

3
涂抹和清理过滤器是合适的方式,但您需要使用在gitattributes(7)中描述的过滤器流程。因为在检出期间涂抹提交时,HEAD尚未更新,因此无法查询给定修订版本的日期。
在最新版本的Git(绝对是2.26,但可能是2.25),您可以使用过滤器过程(filter process)查找提交记录如果可用的话。如果提交标识符可用,则可以查询传递给过滤器过程的元数据中的treeish。如果可用,则为提交;如果不存在,则为文件树。如果不是提交,则可以使用HEAD
这些元数据在使用smudgeclean时不会被传递,只有在使用filter-process时才会传递。所以如果需要这个功能,确实需要创建一个小的过程筛选器(process filter)。
还要注意,您的清理过滤器应该去掉日期并且不要将其包含在提交中。如果在实际提交中存储了日期,则每次合并分支时都会出现合并冲突。
最后,如果您不需要在每个类中都添加DATE字段,则可以避免所有这些,并选择更简单的解决方案。如果您的项目包含一个带有元数据的单个静态类,则可以在构建步骤之一调用Git创建并将DATE字段放在那里,然后不需要使用过滤器。这将更简单、更快速、更简洁。如果需要生成tarball,您可以在生成tarball时生成该文件。

实际上,具有日期字段的类具有构建号。因此,每当对该类进行任何更改时,该类的构建号将手动更改。GIT应该负责DATE字段。项目中也没有单个静态类。我尝试找到解决方案,但最终只能使用smudge和clean过滤器。 - Vishnu
有没有更好的解决方案?我遇到了 Git 钩子,这会有帮助吗? - Vishnu
如前所述,您不应该在提交文件时将日期放入每个文件中,因为这会导致每次合并时都出现合并冲突。因此,虽然使用钩子是可能的,但最终你会在提交中得到该值,而这是不希望看到的。在构建时生成此数据确实是理想的方法,但如果您不想这样做,则使用过滤器进程是唯一的其他真正选项。 - bk2204
Git不像CVS那样做。你可以使用ident属性,但除此之外,你需要一个smudge/clean过滤器。我部分地在过滤过程中实现了扩展元数据,部分原因就是为了这个;在那之前,这根本不可能。很抱歉让你失望了;事情就是这样。 - bk2204

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接