gitlab批量拉取代码
在项目列表打开控制台,执行以下代码,打印拉取本页项目代码命令
var list = [];$.each($('.projects-list .project-title a'),(k,v) => {console.log(v.href);list.push('git clone '+v.href)});list.join(';')
// 如果是分组下的项目列表,使用这个
var list = [];$.each($('.groups-list .project-row-contents>a'),(k,v) => {console.log(v.href);list.push('git clone '+v.href)});list.join(';')
温馨提示:分批并行拉取效果更好
克隆代码
@Test
public void fastclone() {
String diskSymbol = "D";
String workPath = "/yourpath";
// git project urls
List<String> purls = new ArrayList<>();
FileUtil.mkdir(diskSymbol + ":" + workPath);
List<List<String>> split = ListUtil.split(purls, RuntimeUtil.getProcessorCount());
split.parallelStream().forEach(urls -> {
List<String> commands = new ArrayList<>();
commands.add(diskSymbol + ":");
commands.add(String.format("cd %s:%s", diskSymbol, workPath));
urls.forEach(url -> commands.add("git clone " + url));
Process p = RuntimeUtil.exec(null, new File("C:/WINDOWS/system32"), "cmd.exe /c " + String.join(" && ", commands));
System.out.println(RuntimeUtil.getResult(p));
p.destroy();
});
}
更新代码
@Test
public void fastpull() {
String diskSymbol = "D";
String workPath = "/yourpath";
File file = new File(diskSymbol + ":" + workPath);
if (file.exists()) {
file.mkdirs();
}
File[] files = file.listFiles();
List<String> pdirs = Arrays.stream(Optional.ofNullable(files).orElse(new File[]{})).filter(File::isDirectory).map(File::getAbsolutePath).collect(Collectors.toList());
List<List<String>> split = ListUtil.split(pdirs, RuntimeUtil.getProcessorCount());
split.parallelStream().forEach(dirs -> {
for (String dir : dirs) {
String[] commands = {"cmd","/c","echo ====== %cd% ====== && git pull"};
Process p = RuntimeUtil.exec(null, new File(dir), commands);
System.out.println(IoUtil.read(p.getInputStream()));
p.destroy();
}
});
}
拉取代码python版本
import os
import subprocess
from multiprocessing import Pool
import multiprocessing
def pull_dir(dir):
commands = ["cmd", "/c", "echo ====== %cd% ====== && git pull"]
p = subprocess.Popen(commands, cwd=dir, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
output, _ = p.communicate()
print(output.decode())
def fastpull():
diskSymbol = "D"
workPath = "/xian/refactor"
directory = diskSymbol + ":" + workPath
if not os.path.exists(directory):
os.makedirs(directory)
dirs = [f for f in os.listdir(directory) if os.path.isdir(os.path.join(directory, f)) and f != "logs" and f != "xian-transfer"]
pdirs = [os.path.abspath(os.path.join(directory, d)) for d in dirs]
num_processors = multiprocessing.cpu_count()
split = [pdirs[i:i+num_processors] for i in range(0, len(pdirs), num_processors)]
for item in split:
with Pool() as pool:
pool.map(pull_dir, item)
if __name__ == "__main__" :
fastpull()