如何使用 GNU-make 变量保护文件中的 git 信息
How do I safe git information in a file using GNU-make variables
我想将一些 git 信息保存在一个文本文件中,我想把它放在我项目的 src 文件夹中。
如果分支 Master 被签出,我只想要最新提交的日期。如果签出任何其他分支,我想要分支的日期和名称,如下所示:
date-branchname
这是我的代码:
src/version2.txt:
DATE=$(shell git log -1 --date=format:"%Y.%m.%d" --format="%ad")
BRANCH=$(shell git rev-parse --abbrev-ref HEAD)
ifeq ($(BRANCH), 'Master')
$(DATE) > $@
else
DATE+='-'
DATE+=$(BRANCH)
$(DATE) > $@
endif
我是 GNU make 的新手,对它的语法很困惑。
我假设我的 ifeq/else 块工作正常,因为我检查了在检查 Master 或其他一些分支时将虚拟文本打印到 version.txt
文件。
我还看到了获取日期或分支的命令没问题,因为我可以像这样将它们放入文本文件:
git log -1 --date=format:"%Y.%m.%d" --format="%ad" > $@
只有当我要使用变量时,变量似乎是空的,例如
$(DATE) > $@
似乎向文本文件打印了一个空字符串。
另外,我不知道我创建 DATE-BRANCH 输出的方式是否完全正确。
我花了很长时间尝试,真的很感激一些帮助。
谢谢
- 您不能在配方中创建 GNU make 变量并稍后在 GNU make 文件中使用它们,因为 GNU make 首先解析整个文件然后 运行s 配方
- 您不能在食谱中使用 GNU make
ifeq
s
命令行中的 %
可能会导致 Windows 出现问题,因此我在以下代码中为其添加了一个解决方法(如果您的 Makefile 只适用于类 Unix 系统,请跳过它)
'
不应在 ifeq
s 常量中使用(GNU make 按字面意思读取)
src/version2.txt
不依赖于任何东西,因此不会被 GNU make 重新生成(如果它已经存在),考虑 .PHONY
作为目标
试试这个:
BRANCH:=$(shell git rev-parse --abbrev-ref HEAD)
ifeq ($(OS),Windows_NT)
P:=%%
else
P:=%
endif
.PHONY : src/version2.txt
ifeq ($(BRANCH),master)
src/version2.txt :
git log -1 --date=format:"$PY.$Pm.$Pd" --format="$Pad" >$@
else
src/version2.txt :
git log -1 --date=format:"$PY.$Pm.$Pd" --format="$Pad-$(BRANCH)" >$@
endif
请注意,每次 运行 make
时都会计算 BRANCH
,即使不应重新生成 src/version2.txt
。
我想将一些 git 信息保存在一个文本文件中,我想把它放在我项目的 src 文件夹中。
如果分支 Master 被签出,我只想要最新提交的日期。如果签出任何其他分支,我想要分支的日期和名称,如下所示:
date-branchname
这是我的代码:
src/version2.txt:
DATE=$(shell git log -1 --date=format:"%Y.%m.%d" --format="%ad")
BRANCH=$(shell git rev-parse --abbrev-ref HEAD)
ifeq ($(BRANCH), 'Master')
$(DATE) > $@
else
DATE+='-'
DATE+=$(BRANCH)
$(DATE) > $@
endif
我是 GNU make 的新手,对它的语法很困惑。
我假设我的 ifeq/else 块工作正常,因为我检查了在检查 Master 或其他一些分支时将虚拟文本打印到 version.txt
文件。
我还看到了获取日期或分支的命令没问题,因为我可以像这样将它们放入文本文件:
git log -1 --date=format:"%Y.%m.%d" --format="%ad" > $@
只有当我要使用变量时,变量似乎是空的,例如
$(DATE) > $@
似乎向文本文件打印了一个空字符串。 另外,我不知道我创建 DATE-BRANCH 输出的方式是否完全正确。 我花了很长时间尝试,真的很感激一些帮助。 谢谢
- 您不能在配方中创建 GNU make 变量并稍后在 GNU make 文件中使用它们,因为 GNU make 首先解析整个文件然后 运行s 配方
- 您不能在食谱中使用 GNU make
ifeq
s
命令行中的 %
可能会导致 Windows 出现问题,因此我在以下代码中为其添加了一个解决方法(如果您的 Makefile 只适用于类 Unix 系统,请跳过它)'
不应在ifeq
s 常量中使用(GNU make 按字面意思读取)src/version2.txt
不依赖于任何东西,因此不会被 GNU make 重新生成(如果它已经存在),考虑.PHONY
作为目标
试试这个:
BRANCH:=$(shell git rev-parse --abbrev-ref HEAD)
ifeq ($(OS),Windows_NT)
P:=%%
else
P:=%
endif
.PHONY : src/version2.txt
ifeq ($(BRANCH),master)
src/version2.txt :
git log -1 --date=format:"$PY.$Pm.$Pd" --format="$Pad" >$@
else
src/version2.txt :
git log -1 --date=format:"$PY.$Pm.$Pd" --format="$Pad-$(BRANCH)" >$@
endif
请注意,每次 运行 make
时都会计算 BRANCH
,即使不应重新生成 src/version2.txt
。