一、參考
二、實現
目前在做一個發佈系統,由於有一些項目不能全量發佈,只能增量發佈,所以需要從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