我正在执行需要将git commit date写入要提交的文件之一的任务。我需要在两种情况下进行:
具体来说,更改应如下所示:
提交前: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
*.java filter=dater
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 + '$')
[当我尝试使用上述配置时..它不起作用..寻求帮助来解决此问题,请...
涂抹和清洁过滤器是正确的选择,但是您将必须使用gitattributes(7)
中所述的过滤过程。之所以需要这样做,是因为当在结帐过程中冒用提交时,HEAD
尚未更新,因此无法查询给定修订的日期。
在最近的Git版本中(肯定是2.26,但可能是2.25),您可以使用过滤器过程来获取提交(如果可用)。如果提交ID可用,则可以在传递给过滤过程的元数据中查询treeish
。如果可用,那将是一个提交,如果没有,则将是一棵树(或不存在)。如果不是提交,则应该可以使用HEAD
。
[仅当使用smudge
时,此元数据不会使用clean
和filter-process
传递,因此,如果需要此功能,您确实需要创建一个小的过程过滤器。
[此外,请注意,您的干净过滤器应删除日期,而不应将其实际包含在提交中。如果将日期存储在实际提交中,那么每次合并分支时都会遇到合并冲突。
最后,所有这些都可以避免,如果您不必在每个类中都使用此DATE字段,则可以采用更简单的解决方案。如果您的项目中包含一个带有元数据的静态类,则可以在其中放置DATE字段,通过调用Git将其创建为构建步骤之一,并完全放弃过滤器。这将变得更容易,更快和更简单。如果需要生成tarball,则可以在tarball生成时生成此文件。