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

Vis*_*hnu 5 versioning git version-control

我正在执行一项任务,需要将 git 提交日期写入正在提交的文件之一。我需要它在几种情况下发生:

  • 当分支被推送到远程仓库时
  • 将其合并到 master 中时

具体来说,更改应该如下所示:

提交前: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(具有污迹和清洁过滤器)添加到我的项目。

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

  • .git配置:
    clean  = .git_filters/dater.clean
    smudge = .git_filters/dater.smudge %f 
Run Code Online (Sandbox Code Playgroud)
  • .git属性:
*.java filter=dater 

Run Code Online (Sandbox Code Playgroud)
  • .git_filters:(在父存储库下创建单独的文件夹)
dater.clean:

#!/usr/bin/sh

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

Run Code Online (Sandbox Code Playgroud)
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 + '$')

Run Code Online (Sandbox Code Playgroud)

当我尝试使用上述配置时..它不起作用..请寻求帮助来解决此问题...

bk2*_*204 3

涂抹和清洁过滤器是此处的正确方法,但您必须使用中描述的过滤过程gitattributes(7)。需要这样做的原因是,在签出期间涂抹提交时,HEAD尚未更新,因此无法查询给定修订的日期。

在最新版本的 Git(肯定是 2.26,但也可能是 2.25)中,您可以使用过滤器进程来获取提交(如果可用)。如果提交 ID 可用,您可以treeish在传递给过滤进程的元数据中进行查询。如果可用的话,这将是一个提交,如果不可用,则将是一棵树(或不存在)。如果它不是提交,您应该可以使用它HEAD

smudge此元数据不会使用and传递clean,仅在使用时传递filter-process,因此如果您需要此功能,您确实需要创建一个小型流程过滤器。

另外,请注意,您的干净过滤器应该删除日期,而不是实际将其包含在提交中。如果您将日期存储在实际提交中,那么每次合并分支时都会遇到合并冲突。

最后,所有这些都可以避免,如果您不需要在每个类中都使用此 DATE 字段,您可以采用更简单的解决方案。如果您的项目包含一个带有元数据的静态类,您可以将 DATE 字段放在那里,通过调用 Git 作为构建步骤的一部分来创建它,并完全省去过滤器。这将变得更容易、更快、更简单。如果您需要生成 tarball,则可以在生成 tarball 时生成此文件。