我正在尝试编写一个执行以下操作的
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,而不是看到重命名,您将看到添加和删除.