Shell脚本检查git是否进行更改,然后循环更改文件?

前端之家收集整理的这篇文章主要介绍了Shell脚本检查git是否进行更改,然后循环更改文件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试编写一个执行以下操作的 shell脚本:

>检查远程git仓库是否有任何更改要拉.
>如果远程git存储库中有更改,请拉这些更改.
>循环通过新的或已被修改文件.

通过我的研究,我发现了一些必要的命令来做这些事情,但是我没有能够让它们在shell脚本中一起工作.

这是一个脚本与我有一些命令:

#!/bin/sh

#Check if there are any changed files
git --git-dir="/dir/.git" fetch origin

if git --git-dir="/dir/.git" log HEAD..origin/master --oneline
then

#Output the modified files from the last pull
        git --git-dir="/dir/.git" diff --name-status ORIG_HEAD..

fi

我无法使用这个脚本中的命令的东西是:

> if语句检查是否有更改或不总是为true.我已经尝试if语句与其他git命令,他们也总是真的.似乎git不像正常的shell命令那样得到0或1的响应.如何获得像这样的git命令或其他git命令在if语句中返回正确的响应?
>如何从命令中分配变量输出以将更改的文件查看为数组,以便我可以使用a循环遍历它们?

如果我的脚本中的命令在这种情况下不会真的有效,那么做一个更好的方法呢?

编辑:当我循环访问更改的文件时,我应该更加清楚我需要从远程存储库中提取更改,然后再循环访问这些文件,以便在处理这些文件时,我有最新的更改.

对于您的第一个问题,您可以使用git diff –quiet(或git diff –exit-code),但通常当您使用它的退出代码时,您不希望打印输出,并且git diff –quiet意味着–exit-code)来确定是否有任何更改.如果有变化,那将给你一个1值,如果没有变化则为0.所以如果你想要有代码只有在有变化时才会运行:
if ! git --git-dir="/dir/.git" diff --quiet
then
    # do stuff...
fi

对于你的第二个问题,我会推荐一下read …循环来读取git diff-tree中的行:

git --git-dir="/dir/.git" diff-tree ORIG_HEAD.. | \
    while read srcmode dstmode srcsha dstsha status srcfile dstfile
    do
        # do something with $srcfile and $dstfile
    done

请注意,$srcmode将有一个额外的:在开头,如果文件重命名$dstfile将只有一个值.如果您不想担心重命名,请传递–no-renames,而不是看到重命名,您将看到添加删除.

猜你在找的Bash相关文章