shell脚本通过更改的文件改动检查混帐,然后循环?(Shell script to check g

2019-07-04 13:10发布

我试图写一个shell脚本,执行以下操作:

  1. 检查任何改变拉远程的Git仓库。
  2. 如果在远程git仓库拉变化这些变化。
  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语句来检查是否有改变或并不总是如此。 我曾尝试if语句与其他Git命令,他们也总是如此。 看来,Git并不像你在哪里得到一个0或1的响应正常的shell命令工作。 我怎样才能得到这样的或其他的git命令的git的命令在if语句返回正确的反应?
  2. 我怎样才能从指定命令输出的变量,以修改过的文件到一个数组,这样我可以循环通过他们使用的呢?

如果在我的脚本的命令不会在这种情况下,真正的工作是什么更好的办法来做到这一点?

编辑:对不起本来应该更清晰,当我通过修改过的文件,我需要通过文件之前我环拉从远程资源库的变化,这样,当我使用这些文件我有最新变化循环。

Answer 1:

关于第一个问题,你可以使用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

关于第二个问题,我推荐一个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 ,而不是看到重命名你会看到刚刚添加和删除。



Answer 2:

你说得对, git不正常退出非零状态,除非有一个错误。 我发现,检测未提交的修改的最简单的方法是这样的:

 let changes=0
 while read status filename; do
    let changes=1
    # do something with this filename/status
 done < <(git status --porcelain)
 if (( ! changes )); then
    echo "No changes."
 fi

一般来说,如果你要尝试驾驶从代码混帐,你应该使用--porcelain上那些支持它的子命令,使之更自动化友好的方式行事。 您可能还需要研究图书馆其他语言与混帐无需构建自己的shell命令交互; 例如,在Ruby中有砂粒 。

现在,你的情况,你想检测一下上游改变。 对于这一点,你可能想使用git diff-tree 。 类似的逻辑上述:

 git fetch   # not pull
 while read filename; do
   # do something with filename
 done < <(git diff-tree --name-only origin/master master)  # or whatever branch you're using


Answer 3:

你可以简单地使用git diff --name-only列出变更的文件的所有文件名。

例如,这里一个简单的脚本,列出所有编辑PHP文件,并测试语法。

#!/bin/bash
files=`git diff --name-only | grep -E '.php$' `
for file in $files; do
  php -l $file
done


Answer 4:

如果你的脚本,并要确保回购是在提交的状态(例如,没有新的,修改,或筹备的文件),试试这个:

``` bash
# Get to code.  Exit if unsaved changes in repo
if `git status | grep -q "nothing to commit"`; then
  git checkout --quiet $BRANCH || exit 1
else
  echo "ERROR: repo has unsaved changes"
  exit 1
fi
```

这是我能找到的检查新,改,并上演文件的最简单的事情。



文章来源: Shell script to check git for changes and then loop through changed files?