检测Git中文件的更改

时间:2015-04-12 13:20:39

标签: python git

我看了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'

非常欢迎任何建议。

2 个答案:

答案 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

这应该有效。

相关问题