Vis*_*hnu 5 versioning git version-control
我正在执行一项任务,需要将 git 提交日期写入正在提交的文件之一。我需要它在几种情况下发生:
具体来说,更改应该如下所示:
提交前: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(具有污迹和清洁过滤器)添加到我的项目。
以下是我在项目中配置的内容:
clean = .git_filters/dater.clean
smudge = .git_filters/dater.smudge %f
Run Code Online (Sandbox Code Playgroud)
*.java filter=dater
Run Code Online (Sandbox Code Playgroud)
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)
当我尝试使用上述配置时..它不起作用..请寻求帮助来解决此问题...
涂抹和清洁过滤器是此处的正确方法,但您必须使用中描述的过滤过程gitattributes(7)。需要这样做的原因是,在签出期间涂抹提交时,HEAD尚未更新,因此无法查询给定修订的日期。
在最新版本的 Git(肯定是 2.26,但也可能是 2.25)中,您可以使用过滤器进程来获取提交(如果可用)。如果提交 ID 可用,您可以treeish在传递给过滤进程的元数据中进行查询。如果可用的话,这将是一个提交,如果不可用,则将是一棵树(或不存在)。如果它不是提交,您应该可以使用它HEAD。
smudge此元数据不会使用and传递clean,仅在使用时传递filter-process,因此如果您需要此功能,您确实需要创建一个小型流程过滤器。
另外,请注意,您的干净过滤器应该删除日期,而不是实际将其包含在提交中。如果您将日期存储在实际提交中,那么每次合并分支时都会遇到合并冲突。
最后,所有这些都可以避免,如果您不需要在每个类中都使用此 DATE 字段,您可以采用更简单的解决方案。如果您的项目包含一个带有元数据的静态类,您可以将 DATE 字段放在那里,通过调用 Git 作为构建步骤的一部分来创建它,并完全省去过滤器。这将变得更容易、更快、更简单。如果您需要生成 tarball,则可以在生成 tarball 时生成此文件。