首页 » 其他 » 正文

Git 拉取部分代码

原文

基本流程
mkdir 仓库名
cd 仓库名
git init 
git remote add origin git地址

// 开启Sparse Checkout模式
git config core.sparsecheckout true

// 设置需Check Out的文件
echo "文件路径" >> .git/info/sparse-checkout

// Check Out
git pull origin 分支名(一般是master)
python实现
import os
import signal
import subprocess
import platform
import json


def get_git_file():
    """
    拉取git的部分代码
    :return:
    """
    try:
        release_info = {
            'git_path': 'xxxx',
            'git_branch': 'sit', # 分支,一般是master
            'update_files': [
                'src/scbyao.exb',
                'src/cmpeod03.sjl',
                'src/aibd230.btb',
                'src/gdot5810.cpy',
                'src/ibbdpbal.btb',
                'src/sczics.olb',
                'src/bptbank.tbl',
                'src/vflhead.prm',
                'src/bspeo@r2.sjl',
                'src/cmbdinf.btb',
                'src/bptevet.tbl',
                'src/ddztdcwh.olb'
            ],
        }
        git_folder = '/data/git_folder/test'

        # 初始化
        cmd = 'cd %s && git init' % git_folder
        print('git初始化,执行的命令为: %s' % cmd)
        (code, msg) = run_cmd(cmd)
        print('git初始化,执行的结果为: %s' % msg)

        if code:
            raise Exception('git初始化失败,原因是:%s' % msg)

        # 添加仓库
        cmd = 'cd %s && git remote add origin %s' % (git_folder, release_info['git_path'])
        print('添加仓库,执行的命令为: %s' % cmd)
        (code, msg) = run_cmd(cmd)
        print('添加仓库,执行的结果为: %s' % msg)

        if code:
            raise Exception('添加仓库,原因是:%s' % msg)

        # 开启Sparse Checkout模式
        cmd = 'cd %s && git config core.sparsecheckout true' % git_folder
        print('开启Sparse Checkout模式,执行的命令为: %s' % cmd)
        (code, msg) = run_cmd(cmd)
        print('开启Sparse Checkout模式,执行的结果为: %s' % msg)

        if code:
            msg = '开启Sparse Checkout模式失败,原因是:%s' % msg
            raise Exception(msg)

        # 设置需Checkout的文件
        update_files = []
        for file in release_info['update_files']:
            cmd = 'cd %s && echo "%s" >> .git/info/sparse-checkout' % (git_folder, file)
            (code, msg) = run_cmd(cmd)

            if code:
                msg = '设置需Check Out的文件失败,原因是:%s' % msg
                raise Exception(msg)
            update_files.append(file)

        print('需要checkout的文件有:%s' % json.dumps(update_files))

        # 拉代码
        cmd = 'cd %s && git pull origin %s' % (git_folder, release_info['git_branch'])
        print('拉代码,执行的命令为: %s' % cmd)
        (code, msg) = run_cmd(cmd)
        print('拉代码,执行的结果为: %s' % msg)

        return 0, 'success'
    except Exception as e:
        return 1, str(e)


def run_cmd(cmd_string, timeout=600):
    """
    执行命令
    :param cmd_string:  string 字符串
    :param timeout:  int 超时设置
    :return:
    """
    p = subprocess.Popen(cmd_string, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, shell=True, close_fds=True,
                         start_new_session=True)

    format = 'utf-8'
    if platform.system() == "Windows":
        format = 'gbk'

    try:
        (msg, errs) = p.communicate(timeout=timeout)
        ret_code = p.poll()
        if ret_code:
            code = 1
            msg = "[Error]Called Error : " + str(msg.decode(format))
        else:
            code = 0
            msg = str(msg.decode(format))
    except subprocess.TimeoutExpired:
        p.kill()
        p.terminate()
        os.killpg(p.pid, signal.SIGTERM)

        code = 1
        msg = "[ERROR]Timeout Error : Command '" + cmd_string + "' timed out after " + str(timeout) + " seconds"
    except Exception as e:
        code = 1
        msg = "[ERROR]Unknown Error : " + str(e)

    return code, msg

发表评论