背景:公司由于一些问题,需要将外网GitLab上的代码迁移至内网GitLab,中间遇到一些坑在此记录一下。
1.Git两种协议及适应场景
一个Git项目最重要的文件是.git文件,对代码的操作其实是对.git文件的操作(如拉取代码,推送代码等)。Git常用的两种协议:SSH或HTTPS,我将根据自己的理解,说说这两种协议各自应用场景;
HTTPS:每次访问都要求输入用户名和密码,可在文件中保存密码防止重复输入
设置git config --global credential.helper store,默认会在用户目录下创建.git-credentials文件,里面保存账户名和密码;取消保存:git config --global credential.helper "",也可以直接修改.gitconfig文件中对应属性值;
访问链接:https://gitlab.com/dlstone/test.git
或者 https://username:password@gitlab.com/dlstone/test.git(URL中携带用户名和密码)
适合场景:不同项目在同一repository中有相同账号名和密码;
SSH:使用公私钥来访问,使用ssh-keygen生成
设置ssh-keygen参考链接:
创建密钥:https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/
配置密钥:https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/
访问格式:git@gitlab.com:dlstone/test.git
适合场景:不同项目在不同repository中有不同账号名和密码;
2.GitLab项目导入
新建项目,选择Import project from Git repository URL,按照给出的样例拼接URL即可;
遇到问题:新建项目每个导入选项都有详细说明,在不熟悉的情况下,没有研究每个选项的具体作用就直接动手实践,导致浪费了不少时间。以后在类似的场景,首先应该研究每个导入功能的适用场景,从中选择最佳实践。
3.wiki迁移
1.将需要迁移的wiki内容clone到本地;
2.将新项目的wiki内容clone到本地;
3.拷贝wiki内容至新项目并提交;
wiki拷贝迁移有个问题,以往的提交日志丢失;wiki与工程仓库是两个独立的.git文件,需要区分两者的差别;
4.应用部署脚本中仓库地址替换
遇到的问题:迁移的项目工程多,每个工程的部署脚本都需要修改,可使用sed,grep命令来批量替换字符串(MAC适用);
替换单个文本中字符串:sed -i "" "s/{regular_expression}/{replacement}/g" test.txt
替换当前目录下匹配的字符串:sed -i "" "s/{regular_expression}/{replacement}/g" `grep "{regular_expression}" -rl ./`
5.Git Submodule处理
添加:对于主工程来说添加submodule就像添加一个文件,所以需要 add 并 commit
添加submodule:git submodule add https://gitlab.com/dlstone/child.git
添加当前目录下所有文件:git add .
提交本地:git commit -m "add submodule"
push到服务器:git push origin maser
clone:与普通文本不一样,对于含有submodule的工程需要做特殊处理
clone代码:git clone https://gitlab.com/dlstone/test.git
子工程初始化:git submodule init
查看状态:git submodule
更新:git submodule update --remote
更新:submodule有更新,首先将submodule工程的修改提交,然后根据以下步骤更新主工程
更新:git submodule update --remote
添加当前目录下所有文件:git add .
提交本地:git commit -m "add submodule"
push到服务器:git push origin maser
5.Jenkins配置修改
修改Repositories地址和认证
修改submodule配置
删除部署脚本中的submodule命令,不删除会报错(第2步已配置,可删除)