【问题标题】:Conditions from sh syntax to Makefile syntax从 sh 语法到 Makefile 语法的条件
【发布时间】:2019-11-21 21:09:04
【问题描述】:

我有一个特定的文件 UPDATE.sh。该文件的任务是使用 git merge 更新我的程序。

UPDATE.sh:

#!/usr/bin/env bash

git fetch https://xxxxx

newUpdatesAvailable=`git diff HEAD FETCH_HEAD`

if [[ "$newUpdatesAvailable" != "" ]]
then
        git branch backup
        git checkout backup
        git add .
        git add -u
        git commit -m date "+%d.%m.%Y"
        git checkout master

        git merge FETCH_HEAD
else
        echo "No updates..."
fi

我必须写同样的东西,但要使用 Make 语法。

我试图弄清楚 Make 中的条件,但对我来说没有用。

请告诉我如何在不使用的情况下在 Makefile 中正确编写:

update:
      ./UPDATE.sh

【问题讨论】:

标签: if-statement github makefile sh gnu-make


【解决方案1】:

另一个不需要大量引用、分号等的替代方法是利用 make 将在退出代码非零时停止执行规则这一事实。

这通常会使 Makefile 更易于维护,规则更简单。

update:
        git fetch https://xxxxx
        git diff -q HEAD FETCH_HEAD || { echo "No Update" ; false ; }
        git branch backup
        git checkout backup
        git add .
        git add -u
        git commit -m date "+%d.%m.%Y"
        git checkout master
        git merge FETCH_HEAD

【讨论】:

    【解决方案2】:

    你不需要捕获git diff的输出;您只需要知道是否存在 差异。使用-q 选项。

    if ! git diff -q HEAD FETCH_HEAD; then
      git branch backup
      ...
    else
      echo "No updates"
    fi        
    

    -q 抑制输出并暗示--exit-code,如果存在差异,这会导致git diff 以非零退出状态退出。

    在 Makefile 中,这将是

    .PHONY: update
    
    update:
            git fetch https://xxxxx
            if ! git diff -q HEAD FETCH_HEAD; then \
              git branch backup && \
              git checkout backup && \
              git add . && \
              git add -u && \
              git commit -m date "+%d.%m.%Y" && \
              git checkout master && \
              git merge FETCH_HEAD; \
            else \
              echo "No updates"; \
            fi
    

    分号和反斜杠是必需的,因为整个if 语句必须出现在一个逻辑行上。

    【讨论】:

    • 为了可靠起见,我将添加.PHONY: update 以便更新不会被名为update 的现有文件跳过。我还会在if 之前添加set -e;,让shell 在第一个不成功的命令时退出,而不是继续进行随机更改。
    • 我不建议使用set -e,但如果有任何失败,我会更新答案以使命令链短路。
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 2012-11-30
    • 2023-03-25
    相关资源
    最近更新 更多