我正在尝试编写一个执行以下操作的 shell 脚本:
- 检查远程 git 存储库是否有任何要提取的更改。
- 如果远程 git 存储库中有更改,请 pull 这些更改。
- 遍历新的或已修改的文件。
通过我的研究,我发现了一些执行这些操作所必需的命令,但我无法让它们在 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 语句总是为真。我已经尝试过其他 git 命令的 if 语句,它们也总是正确的。似乎 git 不像普通的 shell 命令那样工作,你会得到 0 或 1 的响应。我怎样才能获得像这样的 git 命令或其他 git 命令以在 if 语句中返回正确的响应?
- 如何将查看已更改文件的命令输出的变量分配给一个数组,以便我可以使用 for 循环遍历它们?
如果我的脚本中的命令在这种情况下不会真正起作用,那么执行此操作的更好方法是什么?
编辑:抱歉,当我循环遍历更改的文件时,我需要在循环遍历文件之前从远程存储库中提取更改,以便在我处理这些文件时获得最新的更改。
p>最佳答案
对于您的第一个问题,您可以使用 git diff --quiet
(或 git diff --exit-code
,但通常当您使用它时exit code 你希望它无论如何都不打印输出,并且 git diff --quiet
暗示 --exit-code
) 以确定是否有任何更改。如果有变化,它会给你一个 1 值,如果没有变化,它会给你一个 0 值。因此,如果您希望代码仅在发生更改时运行:
if ! git --git-dir="/dir/.git" diff --quiet
then
# do stuff...
fi
对于你的第二个问题,我建议使用 while 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
,您不会看到重命名,而只会看到添加和删除。
关于git - 用于检查 git 更改然后遍历更改文件的 Shell 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13715544/