2013-09-23 98 views
0

我有一个钩子,它接受已更改的文件并将它们复制到标准提交工作的目录中,但合并的自动提交将它断开,因为最后两个提交不包含任何更改的文件git hook在自动提交后获取变更集

这里是我当前的代码

generateChangeSet() { 
    if [ ! -d $WORKDIR ];then 
     mkdir $WORKDIR 
    fi 

    CHANGESET=$(git log -1 --name-status $oldrev $newrev | grep -v -e "^Merge" -e "^commit" -e "^Author" -e "^Date" -e "^ " -e "^$") 
    if [ -z $CHANGESET ]; then 
     echo Could not detect any files in the change set, aborting push 
     exit $RETVAL 
    fi 

    # Get a list of deleted files 
    DELFILES=$WORKDIR/deletedFiles.sh 
    if [ -f $DELFILES ];then 
     rm -rf $DELFILES 
    fi 

    for dFile in $(echo $CHANGESET | grep "^D" | awk '{print $2}'); do 
     echo deleted file $dFile 
     echo rm -f $dFile >> $DELFILES 
    done 
    if [ -f $DELFILES ];then 
     sed -i '1s/^/#!\/bin\/bash\n/' $DELFILES 
     chmod +x $DELFILES 
     echo find . -depth -type d -empty >> $DELFILES 
     echo rm deletedFiles.sh >> $DELFILES 
    fi 

    echo "Generating diff between $newrev and $oldrev" 
    git archive HEAD $(echo $CHANGESET | grep -v "^D" | awk '{print $2}') | (cd $WORKDIR && tar xf -) 
} 

如何拿到剧本,以获得最新修改过的文件在任何时候任何想法?

感谢

回答

1

我会通过被关注的是目标($WORKDIR?)可能不同步与增量在这里被计算在第一时间启动。为什么通过shell脚本导出删除?为什么不直接git checkout到一个新的目标(设置GIT_WORK_TREE做到这一点),例如:

what_to_replace=/some/where/tree 
tmp_replacement=/some/where/tree.new 

rm -rf $tmp_replacement 
mkdir $tmp_replacement || fatal "can't create $tmp_replacement" 

GIT_WORK_TREE=$tmp_replacement git checkout master -- . || 
    fatal "can't create updated master branch tree" 
mv $what_to_replace ${what_to_replace}.old && 
    mv $tmp_replacement $what_to_replace || 
    fatal "can't swap in $tmp_replacement" 
rm -rf ${what_to_replace}.old || 
    warn "can't clean up ${what_to_replace}.old" 

(这可能需要某种形式的锁定添加的,多一些充实)。但是,如果你决定去与现有的代码(有可能是某种原因(S)这样做),这部分仅仅是愚蠢的:

CHANGESET=$(git log -1 --name-status $oldrev $newrev | grep -v -e "^Merge" -e "^commit" -e "^Author" -e "^Date" -e "^ " -e "^$")

相反,使用git diff-tree --name-status $oldrev $newrev区分与给定提交相关的树。其余的应该很容易。这一切都假定$oldrev准确地反映了当前正在更新的任何状态。

+0

你是对的$ WORKDIR不同步。我首先这样做的原因是,由于历史原因,源代码包含硬编码数据库方案,我的任务是修复到位之前从git获取代码到测试服务器,并用测试服务器上的模式替换数据库方案。我在变更集上做的理由是,在整个源代码中进行搜索和替换需要很长时间,因为有超过25k个文件。我面临的问题是,当自动提交发生例如合并之后,$ oldrev不能正确反映 – rojanu

+1

也许你应该在某处($ WORKDIR?)记录最后一次更新(通过钩子)。然后你可以使用'git diff-tree'来比较那个rev,而不是'$ oldrev'($ oldrev从哪里来,钩子的输入,我假设),而不是'$ newrev'。 – torek