我试图写一个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语句来检查是否有改变或并不总是如此。 我曾尝试if语句与其他Git命令,他们也总是如此。 看来,Git并不像你在哪里得到一个0或1的响应正常的shell命令工作。 我怎样才能得到这样的或其他的git命令的git的命令在if语句返回正确的反应?
- 我怎样才能从指定命令输出的变量,以修改过的文件到一个数组,这样我可以循环通过他们使用的呢?
如果在我的脚本的命令不会在这种情况下,真正的工作是什么更好的办法来做到这一点?
编辑:对不起本来应该更清晰,当我通过修改过的文件,我需要通过文件之前我环拉从远程资源库的变化,这样,当我使用这些文件我有最新变化循环。
关于第一个问题,你可以使用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
,而不是看到重命名你会看到刚刚添加和删除。
你说得对, 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
你可以简单地使用git diff --name-only
列出变更的文件的所有文件名。
例如,这里一个简单的脚本,列出所有编辑PHP文件,并测试语法。
#!/bin/bash
files=`git diff --name-only | grep -E '.php$' `
for file in $files; do
php -l $file
done
如果你的脚本,并要确保回购是在提交的状态(例如,没有新的,修改,或筹备的文件),试试这个:
``` 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
```
这是我能找到的检查新,改,并上演文件的最简单的事情。