git - 用于检查 git 更改然后遍历更改文件的 Shell 脚本?

标签 git bash shell pull

我正在尝试编写一个执行以下操作的 shell 脚本:

  1. 检查远程 git 存储库是否有任何要提取的更改。
  2. 如果远程 git 存储库中有更改,请 pull 这些更改。
  3. 遍历新的或已修改的文件。

通过我的研究,我发现了一些执行这些操作所必需的命令,但我无法让它们在 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

我无法使用此脚本中的命令进行操作的是:

  1. 检查是否有变化的 if 语句总是为真。我已经尝试过其他 git 命令的 if 语句,它们也总是正确的。似乎 git 不像普通的 shell 命令那样工作,你会得到 0 或 1 的响应。我怎样才能获得像这样的 git 命令或其他 git 命令以在 if 语句中返回正确的响应?
  2. 如何将查看已更改文件的命令输出的变量分配给一个数组,以便我可以使用 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/

相关文章:

linux - 我该怎么做才能修复案例中的错误?

git - 如何更新 npm 模块,忽略 git repo

git - 从开发中重新定位本地分支

git - 更新**不是**当前分支(在 Git 中)

regex - 匹配非 ascii 字符而不重复使用外部二进制文件

linux - 如何使用BASH脚本获取linux系统中的wlan号

bash - 缩进长行标准输出

bash - 将Oracle查询转换为配置单元

javascript - 在哪里可以找到 Spring Petclinic 的 Angular JS fork ?

macos - 在 Swift 中运行 Shell 命令