0

我有一个钩子,可以获取更改的文件并将它们复制到它适用于标准提交的目录,但是合并的自动提交会破坏它,因为最后两个提交不包含任何更改的文件

这是我当前的代码

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 -)
}

关于如何让脚本始终获取最新更改文件的任何想法?

谢谢

4

1 回答 1

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"

(这可能需要添加某种锁定,并且需要更多的充实)。但是,如果您决心继续使用现有代码(可能有一些理由这样做),这部分只是愚蠢的:

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准确反映了正在更新的状态。

于 2013-09-23T20:06:29.763 回答