前言

  公司的代码都存放在自己搭建的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. git 修改远程仓库地址

    以前的老项目需要修改git路径,为了保留之前的上传记录和分支等可以通过以下方法解决这个问题 sourceTree项目远程仓库,直接修改origin路径,然后提交一个commit即可将项目上传到新的gi ...

  8. 使用私有git仓库备份服务器脚本和配置文件

    1. 创建私有git仓库 服务器端配置: # 安装 git yum -y install git # 创建 git 用户 useradd git # 创建私有仓库数据存储目录 mkdir /git_b ...

  9. 修改Maven仓库地址

    在%USERPROFILE%\.m2\settings.xml例如:C:\Users\LongShu\.m2\settings.xml 可以自定义Maven的一些参数, 复制%M2_HOME%\con ...

随机推荐

  1. fiddler发送post请求

    1.指定为 post 请求,输入 url Content-Type: application/x-www-form-urlencoded;charset=utf-8 request body中的参数格 ...

  2. nagios二次开发(三)---nagiosql架构简介

    NAGIOSQL数据库结构简介 个人觉得如果了解一个系统的架构,应该先从数据库着手,因为数据库是灵魂,当然前提是这个系统用到了数据库.刚才说到了架构,其实我还真不知架构到底是个什么东东,也不知第一句话 ...

  3. HDU2222 Keywords Search

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  4. BZOJ2049: [Sdoi2008]Cave 洞穴勘测 Link-Cut-Tree 模板题

    传送门 搞了这么长时间Splay终于可以搞LCT了,等等,什么是LCT? $LCT$就是$Link-Cut-Tree$,是维护动态树的一个很高效的数据结构,每次修改和查询的均摊复杂度为$O(logN) ...

  5. ie下获取上传文件全路径

    ie下获取上传文件全路径,3.5之后的火狐是没法获取上传文件全路径的 /*获取上传文件路径*/ function getFilePath(obj) { var form = $(this).paren ...

  6. 移动平台前端开发之WebApp代码技巧

    1.首先我们来看看webkit内核中的一些私有的meta标签,这些meta标签在开发webapp时起到非常重要的作用 <meta content="width=device-width ...

  7. chkconfig命令

    chkconfig --list                  #列出系统所有的服务启动情况chkconfig --add xxx           #增加xxx服务chkconfig --de ...

  8. LeetCode Contains Duplicate (判断重复元素)

    题意: 如果所给序列的元素不是唯一的,则返回true,否则false. 思路: 哈希map解决. class Solution { public: bool containsDuplicate(vec ...

  9. 4.mysql数据库创建,表中创建模具模板脚本,mysql_SQL99标准连接查询(恩,外部连接,全外连接,交叉连接)

     mysql数据库创建,表创建模等模板脚本 -- 用root用户登录系统,运行脚本 -- 创建数据库 create database mydb61 character set utf8 ; -- ...

  10. 理解C++ lvalue与rvalue

    一个众所周知的危险错误是,函数返回了一个局部变量的指针或引用.一旦函数栈被销毁,这个指针就成为了野指针,导致未定义行为.而左值(lvalue)和右值(rvalue)的概念,本质上,是理解“程序员可以放 ...