我看了here,但我的问题没有得到解答。 我有一个脚本,可以使许多文件保持最新。存储库包含许多bash和python脚本。其中一个脚本运行在每小时的cronjob上,如下所示:
#! /bin/bash
git fetch origin && git reset --hard origin/dev && git clean -f -d
python -m compileall .
# Set permissions
chmod -R 744 *
基本上它将所有脚本更新为GitHub的当前内容。其中一个脚本是守护程序的代码。当 更改时,我想重新启动守护程序。关于哪些文件被更改,git
命令的输出中没有任何线索。那么,我该怎么做呢?
为了使问题复杂化,我认为python -m compileall
使git
认为所有文件都已更改。但我发现this question似乎有效。
[编辑]额外的红利问题: 根据@ behzad.nouri给出的答案,我修改了代码:
#! /bin/bash
branch=$(cat ~/bin/gitbin.branch)
git fetch origin && \
DIFFdmn=$(git --no-pager diff --name-only $branch..origin/$branch -- ./testdaemon/daemon.py) && \
DIFFlib=$(git --no-pager diff --name-only $branch..origin/$branch -- ./testdaemon/libdaemon.py) && \
git reset --hard origin/dev && git clean -f -d
python -m compileall .
# Set permissions
chmod -R 744 *
if [[ -n "$DIFFdmn" ]]; then
logger -t 02-update-scripts "daemon has changed"
./testdaemon/daemon.py restart
fi
if [[ -n "$DIFFlib" ]]; then
logger -t 02-update-scripts "daemonlib has changed"
./testdaemon/daemon.py restart
fi
其中~/bin/gitbin.branch
应包含要同步的分支的名称。这适用于名为dev
的分支,但对于master
- 分支(在尝试定义DIFFdmn
变量时)失败并显示以下消息:
fatal: bad revision 'master..origin/master'
非常欢迎任何建议。
答案 0 :(得分:3)
git diff --name-only
给出已更改的文件的名称。要避免python -m compileall
问题,您需要与本地分支进行比较,而不是工作目录,如:
git diff --name-only dev..origin/dev
如果您只关心一个文件,请将其传递给diff
命令:
git diff --name-only dev..origin/dev -- path/to/daemon.file
在bash方面,您可以通过-n
检查输出:
DIFF=$(git --no-pager diff --name-only dev..origin/dev -- path/to/daemon.file)
if [[ -n "$DIFF" ]]
then
echo "daemon has changed"
fi
答案 1 :(得分:0)
在接受@ behzad.nouri给出的答案时,我想自己回答奖金问题。因此,至少可以结束这个问题,并且对所提出问题的回答有望对其他人有所帮助。
在奖金问题中代码失败,因为git diff
显然无法比较当前分支。首先,您需要使用git checkout $branch
切换分支,然后执行git diff
。
所以,像这样:
branch=$(cat ~/bin/gitbin.branch)
git checkout $branch
git fetch origin && \
DIFFdmn=$(git --no-pager diff --name-only $branch..origin/$branch -- ./testdaemon/daemon.py) && \
DIFFlib=$(git --no-pager diff --name-only $branch..origin/$branch -- ./testdaemon/libdaemon.py) && \
git reset --hard origin/$branch && git clean -f -d
这应该有效。