node.js实现批量修改git项目的数据源

news/2024/11/15 13:17:18/

        在项目开发过程中,大型项目会分块,每一块都会拥有一个git地址,当想切换git地址的域名时,如果手动一个一个去修改对我们来说费时费力的事情,如果能有一个脚本,一次性批量修改,可以给大家节省很多时间成本。

一般来讲,git源切换只是修改了域名,项目名称基本不会变化

步骤1:引入对应模块

// 引入对应模块
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');

步骤2:声明新旧域名、搜索目录 常量并赋值

// 旧域名和新域名
const OLD_DOMAIN = 'http://xxx.xxx.xxx.xxx/';
const NEW_DOMAIN = 'http://xxx.xxx.xxx.xxx/';// 要搜索的目录
const SEARCH_DIR = '.'; // 当前目录,可以修改为其他目录

 步骤3:定义一个函数,用于遍历当前目录下的所有项目,当然,你可以根据文件夹名称进行过滤

// 查找 Git 仓库并切换远程 URL
function changeGitRemotesInFolders(dir) {fs.readdirSync(dir).forEach(file => {const fullPath = path.join(dir, file);if(!fullPath.includes('.vscode') && !fullPath.includes('node_modules')){const stats = fs.statSync(fullPath);if (stats.isDirectory()) {if (fs.existsSync(path.join(fullPath, '.git'))) {// 这是一个 Git 仓库changeGitRemote(fullPath);}}}});
}

 步骤4:逐个修改项目git地址(注意:进入一个文件夹执行修改命令后,需要退出当前文件夹,回到上一级目录,不然可能会出现找不到下一个项目的报错提示)

process.chdir(folderPath); // 修改当前工作目录

process.chdir('..'); // 返回上一级目录

// 切换 Git 远程仓库 URL(只替换域名)
function changeGitRemote(folderPath) {try {process.chdir(folderPath);// 获取当前远程仓库的 URLconst remoteUrl = execSync('git config --get remote.origin.url').toString().trim();// 检查是否需要替换域名if (remoteUrl.includes(OLD_DOMAIN)) {const newRemoteUrl = remoteUrl.replace(OLD_DOMAIN, NEW_DOMAIN);// 设置新的远程仓库 URLexecSync(`git remote set-url origin ${newRemoteUrl}`);console.log(`Successfully changed remote URL for ${folderPath} from ${remoteUrl} to ${newRemoteUrl}`);} else {console.log(`No need to change remote URL for ${folderPath} (current URL: ${remoteUrl})`);}// process.chdir(process.cwd()); // 理论上这里不需要,因为 process.chdir 是对当前进程的修改,但为清晰起见还是加上process.chdir('..');} catch (error) {console.error(`Error processing ${folderPath}:`, error);}
}

完整代码 

const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');// 旧域名和新域名
const OLD_DOMAIN = 'http://xxx.xxx.xxx.xxx/';
const NEW_DOMAIN = 'http://xxx.xxx.xxx.xxx/';// 要搜索的目录
const SEARCH_DIR = '.'; // 当前目录,可以修改为其他目录// 查找 Git 仓库并切换远程 URL
function changeGitRemotesInFolders(dir) {fs.readdirSync(dir).forEach(file => {const fullPath = path.join(dir, file);if(!fullPath.includes('.vscode') && !fullPath.includes('node_modules')){const stats = fs.statSync(fullPath);if (stats.isDirectory()) {if (fs.existsSync(path.join(fullPath, '.git'))) {// 这是一个 Git 仓库changeGitRemote(fullPath);}}}});
}// 切换 Git 远程仓库 URL(只替换域名)
function changeGitRemote(folderPath) {try {process.chdir(folderPath);// 获取当前远程仓库的 URLconst remoteUrl = execSync('git config --get remote.origin.url').toString().trim();// 检查是否需要替换域名if (remoteUrl.includes(OLD_DOMAIN)) {const newRemoteUrl = remoteUrl.replace(OLD_DOMAIN, NEW_DOMAIN);// 设置新的远程仓库 URLexecSync(`git remote set-url origin ${newRemoteUrl}`);console.log(`Successfully changed remote URL for ${folderPath} from ${remoteUrl} to ${newRemoteUrl}`);} else {console.log(`No need to change remote URL for ${folderPath} (current URL: ${remoteUrl})`);}// process.chdir(process.cwd()); // 理论上这里不需要,因为 process.chdir 是对当前进程的修改,但为清晰起见还是加上process.chdir('..');} catch (error) {console.error(`Error processing ${folderPath}:`, error);}
}// 主函数
function main() {changeGitRemotesInFolders(SEARCH_DIR);
}main();


http://www.ppmy.cn/news/1547208.html

相关文章

Vuex vs Pinia:新一代Vue状态管理方案对比

引言 随着Vue生态系统的不断发展,状态管理已经成为现代Vue应用程序中不可或缺的一部分。Vuex作为Vue官方的状态管理方案,一直是开发者的首选。然而,随着Pinia的出现,为Vue开发者带来了新的选择。本文将深入对比这两个状态管理方案…

从前端react动画引发到计算机底层的思考

一、react 项目 中 数字从0增加到30000,变化动画效果 在 React 中实现数字从 0 增加到 30000 的动画效果,常见的方法是使用 requestAnimationFrame 或者使用 setInterval 来实现递增动画。结合 React 的 state 来更新数字的值,然后在组件中渲…

使用 AMD GPU 上的 Whisper 进行语音转文字

Speech-to-Text on an AMD GPU with Whisper — ROCm Blogs 2024年4月16日,作者:Clint Greene. 介绍 Whisper是由 OpenAI 开发的高级自动语音识别(ASR)系统。它采用了一个简单的编码器-解码器 Transformer 架构,其中…

windows C#-LINQ查询

查询是一种从数据源检索数据的表达式。 不同的数据源具有不同的原生查询语言,例如,用于关系数据库的 SQL 和用于 XML 的 XQuery。 开发人员对于他们必须支持的每种数据源或数据格式,都必须学习一种新的查询语言。 LINQ 通过为各种数据源和数据…

Linux的进程,线程;FreeRTOS的任务

Linux 进程与线程 进程 (Process) 定义:进程是操作系统进行资源分配和调度的基本单位。每个进程都有独立的地址空间,包括代码段、数据段、堆栈等。资源:每个进程拥有独立的内存空间、文件描述符、环境变量等。创建:通常通过 fork 系统调用创建新进程,子进程继承父进程的大…

Word VBA如何间隔选中多个(非连续)段落

实例需求:Word文档中的有多个段落,段落总数量不确定,现在需要先选中所有基数段落,即:段落1,段落3 … ,然后一次性设置粗体格式。 也许有的读者会认为这个无厘头的需求,循环遍历遍历文…

linux startup.sh shutdown.sh (kkFileView)

linux启动脚本和关闭脚本startup.sh shutdown.sh (kkFileView) startup.sh DIR_HOME("/opt/openoffice.org3" "/opt/libreoffice" "/opt/libreoffice6.1" "/opt/libreoffice7.0" "/opt/libreoffice7.1&q…

Zabbix使用

1.Zabbix术语 术语名称术语解释主机(Host)一台你想监控的网络设备,用 IP 或域名表示监控项(Item)接收的主机的特定数据,一个度量数据触发器(Trigger)一个被用于定义问题阈值和“评估”监控项接收到的数据的…