我有以下 git 操作,它允许我下载图像。
我必须确保文件是否已经存在才能跳过“提交文件”和“推送更改”
如何检查文件是否已经存在,如果已经存在则不执行任何操作。
on:
workflow_dispatch:
name: Scrape File
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
name: Check out current commit
- name: Url
run: |
URL=$(node ./action.js)
echo $URL
echo "URL=$URL" >> $GITHUB_ENV
- uses: suisei-cn/actions-download-file@v1
id: downloadfile
name: Download the file
with:
url: ${{ env.URL }}
target: assets/
- run: ls -l 'assets/'
- name: Commit files
run: |
git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
git add .
git commit -m "Add changes" -a
- name: Push changes
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
branch: ${{ github.ref }}
这里有一些选项 - 您可以直接使用 bash 并执行如下操作:
if test -f "$FILE"; then
#file exists
fi
或使用现有操作之一,如下所示:
- name: Check file existence
id: check_files
uses: andstor/file-existence-action@v1
with:
files: "assets/${{ env.URL }}"
- name: File exists
if: steps.check_files.outputs.files_exists == 'true'
run: echo "It exists !"
我早些时候处理过一个非常类似的情况,并开发了一种方法,不仅可以检查添加的文件,而且如果您想检查修改或删除的文件或目录也很有用。
此解决方案仅在 git 存储库中添加/修改/删除文件时才有效。
命令
git status --short
将返回未跟踪、已删除和已修改文件的列表。例如:-
D deleted_foo
M modified_foo
?? untracked_dir_foo/
?? untracked_file_foo
A tracked_n_added_foo
请注意,我们运行与
git status -s
相同的命令。
当您阅读输出时,您将看到以下形式的一些行:
** filename
** dirname/
请注意,这里
**
代表该行的第一个单词(例如 D
、??
等)。
以下是各行中所有
**
的摘要:
|
意义 |
---|---|
|
文件/目录已被删除。 |
|
文件/目录已被修改。 |
|
文件/目录已添加,但未使用 进行跟踪。 |
|
文件/目录已添加并使用 进行跟踪。 |
注意:注意空格! 例如,在以下解决方案中使用
M
代替 M
将无法按预期工作!
我们可以通过
grep
的输出来检查文件/目录是否被添加/修改/删除。解决方案的外壳部分如下所示:
git status -s
从上表中获取所需的 if git status -s | grep -x "** [FILENAME]"; then
# Do whatever you wanna on match
else
# Do whatever you wanna on no-match
fi
并将
**
替换为文件名。例如,要检查名为 [FILENAME]
的文件是否被修改,请使用:
foo
解释:我们使用git status -s | grep -x " M foo"
来获取输出并将输出通过管道传输到
git status -s
。我们还使用命令行选项 grep
和 -x
来匹配整行。解决方案的工作流程部分:
grep
if [ -d "directory"]; then echo dir exists && echo ok; else echo no dir; fi
功能来实现此目的。 来自文档:
返回与路径模式匹配的文件集的单个哈希值。您可以提供单个路径模式或多个以逗号分隔的路径模式。 (...) 如果路径模式与任何文件都不匹配,则返回空字符串。有关详细信息,请参阅文档:
docs.github.com所以你可以这样做:
hashFiles
但这不适用于检查目录,因为
- name: Commit files
if: ${{ hashFiles('assets/') != '' }}
run: |
git config ...
将为空目录返回空字符串。
该解决方案的版权归 Peter Bengtsson 的博客:peterbe.com/plog