git同步指定分支指定文件,可同步到同一仓库,可同步到不同仓库

news2025/1/21 18:46:56

源代码
run-func.js

const express = require('express');
const fs = require('fs');
const simpleGit = require('simple-git');
const cors = require('cors'); // 引入 cors 模块

const app = express();

// 使用 cors 中间件
app.use(cors());



const git = simpleGit().cwd('../motorbike-copy/mirror-motor');
let targetRepo = simpleGit().cwd('../../motorbike-demo');
let files = ['pagesMy/views/maintainList.vue', 'pagesMy/views/test.vue']


function syncFileToBranch(branchName = 'tianying-1.0.0') {
    branchName = process.argv[process.argv.length - 1];
    let originalBranch;
    
    // 获取当前分支
    git.branch((err, branchSummary) => {
        if (err) {
            console.error('Error getting branch: ', err);
        } else {
            originalBranch = branchSummary.current;
            console.error('当前分支 ', originalBranch);

            // 切换到目标分支
            git.checkout(branchName, (err) => {
                if (err) {
                    console.error('Error checking out branch: ', err);
                } else {
                    console.error('目标分支 ', branchName);

                    // 获取源分支的指定文件
                    git.checkout(originalBranch, ['--', ...files], (err) => {
                        if (err) {
                            console.error('Error getting file from source branch: ', err);
                        } else {
                            // 提交这个文件的更改
                            git.commit('Merged changes from ' + originalBranch, (err) => {
                                if (err) {
                                    console.error('Error committing: ', err);
                                } else {

                                    console.log('Merged file from ' + originalBranch);
                                    // 推送更改
                                    git.push('origin', branchName, (err) => {
                                        if (err) {
                                            console.error('Error pushing: ', err);
                                        } else {
                                            console.error('推送成功');
                                            git.checkout(originalBranch, () => {
                                                console.error('切换会原来的分支', originalBranch);
                                            });
                                        }
                                    });
                                }
                            });
                        }
                    });
                }
            });
        }
    });
}

// 获取源仓库的文件

function copyFileGit(branchName = 'tianying-1.0.0') {
    let originalBranch;
 
    branchName = process.argv[process.argv.length - 1];
    console.log('目标分支: ', branchName);
    
    // 获取当前分支
    git.branch((err, branchSummary) => {
        if (err) {
            console.error('Error getting branch: ', err);
        } else {
            originalBranch = branchSummary.current;
            console.error('当前分支 ', originalBranch);
            git.checkout(originalBranch, ['--', ...files], (err) => {
                if (err) {
                    console.error('Error getting file from source repo: ', err);
                } else {
                    // 复制文件到目标仓库
                    files.forEach(file => {
                        fs.copyFileSync('../motorbike-copy/mirror-motor/'+file, '../../motorbike-demo/'+file);
                    })

                    // 在目标仓库中提交文件的更改
                    targetRepo.add(files, (err) => {
                        if (err) {
                            console.error('Error adding file in target repo: ', err);
                        } else {
                            targetRepo.commit('Synced ' + ' from source repo', (err) => {
                                if (err) {
                                    console.error('Error committing in target repo: ', err);
                                } else {
                                    // 推送更改到目标仓库的远程仓库
                                    targetRepo.push('origin', branchName, (err) => {
                                        if (err) {
                                            console.error('Error pushing to target repo: ', err);
                                        } else {
                                            console.log('Synced '  + ' from source repo to target repo');
                                        }
                                    });
                                }
                            });
                        }
                    });
                }
            });
        }
    })


}


module.exports = {
    syncFileToBranch,
    copyFileGit
};

package.json

{
  "dependencies": {
    "cors": "^2.8.5",
    "express": "^4.18.2",
    "simple-git": "^3.21.0"
  },
  "scripts": {
    "mergeto": "run-func run-func.js syncFileToBranch -- arg1",
    "copyto": "run-func run-func.js copyFileGit -- arg1"
 }
}

执行命令:

当前分支的指定文件(上述代码中的的字段files 表示需要同步哪些文件)
合并到tianying-3.0.0分支并push到远程仓库

npm run mergeto tianying-3.0.0

复制文件到另一个仓库的3.0.0 的分支

npm run copyto 3.0.0

里面涉及到的知识点
simple-git:通过调用方法,可处理git命令
run-func:通过此库,node可直接通过命令执行函数

完全复制一个仓库,包括分支,历史记录等
在这里插入图片描述
执行 git clone --mirror 原来的远程仓库,会得到如下的文件
在这里插入图片描述
执行git push --mirror 目标仓库,此时所有的分支、历史记录全都会同步到新的分支上
在这里插入图片描述
此时在git clone 仓库,默认会clone master分支,然后git fetch -all 去拉取所有的远程分支,通过git branch -a 命令来查看所有的分支

合并分支的源代码:Git 本身并不支持直接合并指定的文件,它的合并操作是基于分支的。当你执行一个合并操作时,Git 会尝试将一个分支的所有更改合并到另一个分支。

const express = require('express');
const fs = require('fs');
const simpleGit = require('simple-git');
const cors = require('cors'); // 引入 cors 模块

const app = express();


//开启node服务,输入命令

// 使用 cors 中间件
app.use(cors());

const git =  simpleGit().cwd('../motorbike-copy/mirror-motor');


function syncFileToBranch (branchName = 'tianying-1.0.0'){
        branchName = process.argv[process.argv.length-1];
        console.log('process.argv: ', process.argv);
    console.log('branchName: ', branchName);
    let originalBranch;

    // 获取当前分支
    git.branch((err, branchSummary) => {
        if (err) {
            console.error('Error getting branch: ', err);
        } else {
         
            originalBranch = branchSummary.current;
            console.error('当前分支 ', originalBranch);

            // 切换到目标分支
            git.checkout(branchName, (err) => {
                if (err) {
                    console.error('Error checking out branch: ', err);
                } else {
                    console.error('目标分支 ', branchName);
                    // 合并原来的分支的更改
                    git.mergeFromTo(originalBranch, branchName, (err) => {
                        if (err) {
                            console.error('Error merging: ', err);
                        } else {
                            // 推送更改
                            git.push('origin', branchName, (err) => {
                                if (err) {
                                    console.error('Error pushing: ', err);
                                } else {
                                    console.error('推送成功');
                                    // 切换回原来的分支
                                    git.checkout(originalBranch);
                                   
                                }
                            });
                        }
                    });
                }
            });
        }
    });
}


module.exports = { syncFileToBranch };

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1495747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OSPF NSSA实验简述

OSPF NSSA实验简述 1、OSPF NSSA区域配置 为解决末端区域维护过大LSDB带来的问题,通过配置stub 区域或totally stub区域可以解决,但是他们都不能引入外部路由场景。 No so stuby area (区域)NSSA 可以引入外部路由,支持…

C++小记 -链表

链表 文章目录 链表链表基础理论链表的类型单链表双链表循环链表 链表的存储方式链表的定义链表的操作添加节点删除节点 性能分析构建链表删除节点(内存泄漏的坑)1.直接移除2.使用虚拟头结点3.delete指针后,要将指针置为NULL!&…

【python】对角线遍历

python系列文章目录 【python】基于cv2提取图片上的文本内容 【python】简单作图 【python】数组字符串等实用 【python】sort与sorted排序使用 【python】对角线遍历 python系列文章目录说明1.分析2.注意事项2.1 遍历2.2 区间2.3 顺序 3.代码实现 说明 给你一个大小为 m x n…

SpringCloud Feign实现微服务间的远程调用(黑马头条Day04)

目录 Feign介绍 Feign的执行流程 项目中使用Feign介绍 实现步骤 添加Feign依赖 注册feign远程调用接口,并指定需要调用的微服务 在leadnews-artilce微服务中创建接口实现类 在wemedia微服务中添加EnableFeignClients注解,并指定需要扫描的包 在wem…

突破编程_前端_JS编程实例(简单树结构组件)

1 开发目标 实现如下简单树结构组件: 再点击树节点后,会调用客户端传入的回调函数: 2 详细需求 简单树结构组件需根据客户端提供的参数创建,具备动态构建树形结构节点、选项卡切换及自定义内容显示等功能: &#xf…

R语言生物群落(生态)数据统计分析与绘图教程

原文链接:R语言生物群落(生态)数据统计分析与绘图教程 前沿 R 语言作的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂,涉及众多统计分析方法。 第一 R基础及数据准备 一:R和R…

【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目

作者推荐 视频算法专题 本文涉及知识点 树上倍增 树 图论 并集查找 换根法 深度优先 割点 LeetCode3067. 在带权树网络中统计可连接服务器对数目 给你一棵无根带权树,树中总共有 n 个节点,分别表示 n 个服务器,服务器从 0 到 n - 1 编号…

快速了解Redis

Redis是什么? Redis是一个数据库,是一个跨平台的非关系型数据库,Redis完全开源,遵守BSD协议。它通过键值对(Key-Value)的形式存储数据。 它与mysql数据库有什么区别? redis通过键值对(Key-Value)的形式存储数据&…

深入理解 Vuex:从基础到应用场景

前言 在之前的文章中,我们已经对 Vue.js 有了一定的了解。今天我们要对Vue官方的状态共享管理器Vuex进行详细讲解,将其基本吃透,目标是面对大多数业务需求; 一、介绍 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用…

Rust入门:GCC或VS2019中的c或c++程序如何调用Rust静态库

首先创建一个rust的库,这里我假设命名为c-to-rust1 cargo new --lib c-to-rust1 其中,src/lib.rs的内容如下, #[no_mangle] pub extern "C" fn get_string() -> *const u8 {b"Hello C World\0".as_ptr() }注解 …

高分辨率全球海洋温度和盐度再分析数据Global Ocean Physics Reanalysis(0.083°),并利用matlab读取绘图

1.引言 在研究全球海平面变化的问题中,卫星测高获得总的海平面变化,而海平面变化包含质量变化和比容变化。因此测高数据和海洋物理分析数据对于海平面研究至关重要。 测高数据下载网址: Global Ocean Gridded L 4 Sea Surface Heights And …

【深度学习笔记】计算机视觉——FCN(全卷积网络

全卷积网络 sec_fcn 如 :numref:sec_semantic_segmentation中所介绍的那样,语义分割是对图像中的每个像素分类。 全卷积网络(fully convolutional network,FCN)采用卷积神经网络实现了从图像像素到像素类别的变换 :cite:Long.Sh…

Docker数据卷的挂载

目录 1 概念 2 常用命令 3 操作步骤(主要讲在创建容器时的挂载) 3.1 挂载在默认目录 3.2 挂载在自定义目录 4 附加内容(查看容器的挂载情况) 1 概念 数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。这样容器内…

如何恢复已删除的华为手机图片?5 种方式分享

不幸的现实是,华为的珍贵时刻有时会因为意外删除、软件故障或其他不可预见的情况而在眨眼之间消失。在这种情况下,寻求恢复已删除的图片成为个人迫切关心的问题。 本文旨在为用户提供如何从华为恢复已删除图片的实用解决方案。我们将探索五种可行的方法…

#微信小程序创建(获取onenet平台数据)

1.IDE:微信开发者工具 2.实验:创建一个小程序(http get获取onenet平台数据) 3.记录: 百度网盘链接:https://pan.baidu.com/s/1eOd-2EnilnhPWoGUMj0fzw 提取码: 2023 (1)新建一个工…

CentOS/Fedora/Ubuntu/Debian 系统 wget 命令

wget 是云服务器安装环境和面板常用下载命令。下载软件或从远程服务器下载备份到本地服务器,也可以使用 wget 把文件下载到云服务器上。 VPS wget 命令最常用使用方法如下: 安装 wget 一般来说 wget 命令是系统自带的,方面安装环境和面板&…

LVS----DR模式

一、LVS-DR工作原理 1、LVS-DR数据包流向分析 客户端发送请求到Director Server (负载均衡器),请求的数据报文(源IP是CIP,目标IP是VIP)到达内核空间。Director Server 和Real Server 在同一个网络中,数据通过二层数据…

guava的使用

对数组操作前判断是否会越界&#xff1a; List<String> s new ArrayList<>();System.out.println(Preconditions.checkElementIndex(2,s.size(),"下标长度超过了")); 是否为空 String s null;System.out.println(Preconditions.checkNotNull(s)); 判空…

六自由度Stewart平台的matlab模拟与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1运动学原理 4.2 Stewart平台运动学方程 5.完整工程文件 1.课题概述 六自由度Stewart平台的matlab模拟与仿真&#xff0c;模拟六自由度Stewart平台的动态变化情况以及伺服角度。 2.系统仿真结果 3.核…

设置word目录从正文开始记录页码,并解决word目录正常,但正文页脚处只显示第一页的页码

设置word目录从正文开始记录页码&#xff0c;并解决word目录正常&#xff0c;但正文页脚处只显示第一页的页码 问题详情1&#xff1a;如何设置目录从正文开始记录页码 问题详情2&#xff1a;word目录处的页码正常&#xff0c;但正文只有第一页的页脚处显示页码 解决方法 在设置…