前言

  公司的代码都存放在自己搭建的gitlab上面。之前由于老板升级gitlab。导致下面有个叫做"api"的groups无法访问。通过无所不能的谷歌才知道。在gitlab在某个版本已经把api作为关键词。导致我们改groups下面的所有程序无法进行正常的pull和push。后来通过修改了groups名称才得以恢复。但是我们该groups下面有很多的微服务。因为git仓库地址发生改变,我们只有手动的修改指向。无限git remote rm xxx,gitremote add xxxxxx...... 。

  过了半个月,我们开始用上docker。老板看到gitlab有docker的images,于是就开始折腾了。由于我们之前源码服务器在东西。每次pull和push都有很慢。于是接着这次使用docker,把他板搬回了国内。此处省略过程。。。。。。 老板弄好了,然后对我们说 我们gitlab站点已经搬回了国内,以后访问速度会大大加快,还使用了htpps加密。我一看这个地址,心里已经已经万马。。。。 由于上次经历过无休止的机械工作,于是想着有没有办法写个命令或者脚本让他自己全部替换呢?于是乎有了下面的教程。

思考

  首先我通过git remote -v 命令对比发现新的git仓库的地址和老的git仓库地址区别如下:

#老地址
origin git@code.xxxx.com:rapi/xxx.git
#新地址
origin ssh://git@code.xxxx.com:9922/rapi/xxx.git

  进过对比发现他们都是通过ssh方式进行交互。老的地址是默认的22端口。新的不是,这个也没有影响。大致结构是一样的。所有我们只需要替换前面的url就可以了。这里说明一下我们的项目仓库命名方式是一般和本地的工程名称和仓库地址一致。所以仓库的地址格式和上面一致。这样一来我只需要写个循环。然后依次执行git命令就可以达到批量替换的目的。

编写代码

开发所用的node版本是v8.9.0。这里我们会用到以下2个包:

创建文件

首先创建一个项目,这里取名git_replace。然后分别创建以下文件

  • package.json
  • serevr.js
mkdir git_replace
cd git_replace
touch package.json
touch serevr.js

编写 package.json

在 package.json中写入

{
"name": "git-replace",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node serevr.js"
},
"dependencies": {
"child_process": "^1.0.2",
"fs": "^0.0.1-security"
}
}

编写 serevr.js

  serevr.js里面分为3个function :

  • exelCmd(用于执行cmd命令)代码如下:
  • readFile(用于读取某个目录下面的文件)
  • start(入口函数)

2个配置文件:

  • config( 设置文件目录和git仓库地址等)
  • count(用于统计执行情况)

核心代码如下:

/**
* 执行命令函数
* @param cmd_Sql
* @param isCount
* @returns {Promise}
*/
const exelCmd = function (cmd_Sql,isCount) {
return new Promise(function (resolve, reject) {
try {
const cmd = execSync(cmd_Sql);
//更新计数
if(isCount){
count.成功 += 1;
}
resolve(cmd.toString());
}
catch (e) {
//更新计数
count.失败 += 1;
console.log(`失败命令:${e.cmd}`);
// reject(e);自定义错误
resolve("err");
}
})
}; /**
* 读取文件函数
* @param filePath
* @returns {Promise<any>}
*/
function readFile(filePath) {
return new Promise(function (resolve, reject) {
fs.readdir(filePath, function (error, result) {
if (!error) {
resolve(result);
}
else {
console.log(`请检查路径`);
reject(error);
}
});
});
} /**
* 逻辑代码
* @param filePath
* @returns {Promise<void>}
*/
async function start(filePath) {
let file_info = await readFile(filePath);
for (let i = 0; i < file_info.length; i++) {
count.总共 = file_info.length;
//过滤隐藏文件
if (file_info[i].substring(0, 1) == ".") {
continue;
count.未知 += 1;
}
console.log(`当前项目名称:${file_info[i]}`);
//获取更新前地址
let getOldAddress=await exelCmd (`cd ${filePath}/${file_info[i]}&&git remote -v`);
if(getOldAddress!="err"){
console.log(`更新前地址:\n`+getOldAddress)
//进入项目目录,删除旧的git指向,设置新git指向
await exelCmd(`cd ${filePath}/${file_info[i]}&&git remote rm ${config.origin}&&git remote add ${config.origin} ${config.git_Address}${file_info[i]}`,'F');
console.log(`更新后地址:\n`+await exelCmd (`cd ${filePath}/${file_info[i]}&&git remote -v`))
} }
//输出计数
console.log(count);
}

执行结果

后记

  源码地址。有了这个脚本再也不怕随时更换gitlab地址了。毕竟程序能做的,何必要我们手动去做呢?到此整个脚本编写完成。虽然这个脚本并不能适用于所有的项目,但是希望能帮助有类似需求的人。代码写的不好,请大家多多指教。

批量修改git仓库地址脚本的更多相关文章

  1. 【git】之修改git仓库地址

    方法1 git remote set-url origin <url> 方法2 git remote rm origin git remote add origin [url] 方法三 直 ...

  2. [转]git修改远程仓库地址

    原文链接:http://www.cnblogs.com/lazb/articles/5597878.html 问:Coding远程仓库地址变了,本地git仓库地址如何更新为最新地址 git修改远程仓库 ...

  3. Gradle 修改 Maven 仓库地址

    gradle install--- http://www.itnose.net/detail/6500082.html http://stackoverflow.com/questions/51025 ...

  4. Gradle修改缓存路径 和 Gradle修改Maven仓库地址

    Gradle修改缓存路径 修改gradle启动脚本进入gradle安装的bin目录,使用文本编辑器打开gradle.bat文件,在如图的位置添加以下语句 set GRADLE_OPTS="- ...

  5. linux批量修改文件名的shell脚本

    linux中批量修改文件名的shell脚本代码,主要是使用了rename,结合shell,喜欢的朋友可以参考下 使用 rename 命令  ========================  NAME ...

  6. win10 下安装docker,创建镜像,push镜像到私有仓库,创建私有仓库,修改镜像仓库地址

    通过连接下载window docker安装文件,https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.ex ...

  7. CentOS Linux搭建独立SVN Server全套流程(修改svn仓库地址、服务启动等)

    CentOS Linux搭建独立SVN Server全套流程(修改svn仓库地址.服务启动等) 原 一事能狂便少年 发布于 2016/12/27 11:16 字数 1113 阅读 1.3K  收藏 0 ...

  8. gitlab git仓库地址修改后更新方法

    背景 由于gitlab地址修改后导致本地仓库的远程仓库失效 解决办法 直接修改本地的远程仓库地址 - 进入项目地址git remote -v 查看旧地址 - 更新指令 git remote set-u ...

  9. 修改git仓库的远程地址

    在我们开发的过程中,代码一般是由 git 来管理的,但有些时候我们的 git 仓库的地址可能发生了变换,比如我们使用的 gitLab 地址发生了变化,那么这个时候如何来将原项目的 git 地址进行修改 ...

随机推荐

  1. Number()和new Number()的区别以及一种简单实现

    看MDN Beginners文档的时候注意到了这种用法 var n1 = Number(123); , 冒出的第一个疑问就是和 var n2 = new Number(123); 有什么区别呢? 首先 ...

  2. php实现监控在线服务应用程序小栗子

    下面我就给大家举个栗子(例子) 某单位需要实现监控服务器状态,和监控服务器应用网站,还有需要监控服务器的中间件,数据库状态监控.听到这个任务是不是恨透头疼,这想起来是不是头疼.还好有系统可用,但是我现 ...

  3. 玩转 Redis缓存 集群高可用

    转自:https://segmentfault.com/a/1190000008432854 Redis作为主流nosql,在高并发使用场景中都会涉及到集群和高可用的问题,有几种持久化?场景下的缓存策 ...

  4. 2017-07-06(grep man apropos )

    grep 格式 grep [选项]  字符串  文件名 选项 -i 忽略大小写 -v 排除指定字符串 作用 在文件中查找字符串 例子 grep  "size"  anaconda- ...

  5. Altium designer知识总结

    原理图库文件 =原理图元件库 .schlibPCB库文件=封装库.pcblib 集成库=原理图库文件+封装库 .intlib

  6. Django_实现分页

    需求: 对于有很多数据,并不希望一次性全部展现在一个页面,需要一个分页的,定好每一页显示的内容 那,如何满足这个需求呢? 通过第三方模块  django-pure-pagination pip ins ...

  7. maven(项目管理工具系列 maven 总结二)

    ♣maven是什么? ♣maven下载.安装 ♣了解maven仓库 ♣eclipse配置maven ♣创建maven项目 ♣把maven项目转化为web项目 1.maven是什么? Maven是一个项 ...

  8. Java Cookie和Session

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  9. 【转】<string> <string.h> <cstring>的区别

    #include < string.h > void main() { string aaa = " abcsd d " ; printf( " lookin ...

  10. 手把手 学习Git

    一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以 ...