【Git】拉取部分代碼【原創】

一、參考


二、實現

目前在做一個發佈系統,由於有一些項目不能全量發佈,只能增量發佈,所以需要從git拉取部分代碼即可,以下是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) 

三、代碼示例

使用Python3實現了這個邏輯,可以參考一下:

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/[email protected]',
                '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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章