赞
踩
适用于大型项内无源码管理(git/repo)的源码
公司在进行一些项目的开发时,从供应商原厂给的code内没有包含任何源码管理的文件。需要多人协同开发,但由于项目较大,用git管理效率较低,遂总结出此篇文章供大家参考,也是对我踩坑的记录。
第一次发技术博客,如有说错的地方或者有疑问欢迎各位大佬提出
Repo是谷歌用Python脚本写的调用git的一个脚本,可以实现管理多个git库
Repo实现了很多功能,比如repo init ,repo sync,repo forall等等,如果还不了解的大锅去详细了解下。
关于repo的安装,我是编写了一个linux shell脚本,省的还要去终端上去敲,具体如下:
#!/bin/sh
mkdir ~/bin
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH
echo "export PATH=~/bin:$PATH" >> ~/.bashrc
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
echo "export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'" >> ~/.bashrc
将上面复制下来保存,并且给它加上可执行权限,运行即可。
如果不确定有没有装上?可以运行
which repo
看看是不是你的home目录下的

上面这种就可以了,done~
在新建仓库前,需要确定你需要在项目内的哪些地方新建仓库,如果不知道,则需要自己一个个的确定,或者去找到原仓库内的project.list文件,后面需要利用这个项目内拟创建git的路径。
如果找不到project.list文件,只能找得到default.xml文件,则需要使用cat+awk等命令去把xml中的path路径给过滤出来了,关于这个描述repo仓库的文件内语法具体是什么规则请点击!喊你夺我一下!
ps:(实际xml文件中name才是repo仓的git目录,此处为了方便后面的脚本操作使用path,不影响)
类似的路径文件如下(文后所提到的路径文件皆是指此文件):

git管理账号内操作gitolite,利用路径文件编辑gitolite-admin/conf下的gitolite.conf文件:

添加并上传,gitolite工具会通过钩子程序自动新建所有仓库
git add -A && git commit -m "创建项目仓库"
git push origin master
此处也是利用的脚本一键上传,如下:
#!/bin/sh pause(){ echo $1 echo "exec fail!!!" exit 1 } PRO_DIRS=$1 PROJECT_PATH=你的服务器代码路径(绝对地址) PRO_REPO_DIR=此项目服务器repo主目录,类似(git@localhost:项目主目录)只需要写项目主目录名称即可,因为访问gitolte会自动在~/repositories下找 echo "cd $PROJECT_PATH" cd $PROJECT_PATH || pause parent_path=`pwd` echo "dir:"$parent_path ##标号计数,方便定位是哪个地址出错了,后续手动维护 NUM=0 ##成功计数 CNT=0 while read dir; do NUM=`expr $NUM + 1`; if test -d $dir then cd $parent_path/$dir || pause "cd $parent_path/$dir" ##新建空仓库 git init || pause "git init" ##添加此目录内所有文件 git add -A || pause "git add -A ..." ##提交 git commit -m "init commit" || pause "git commit -m "init commit" ..." ##添加远端地址 git remote add origin $PRO_REPO_DIR/$dir.git || pause "git remote add origin $PRO_REPO_DIR/$dir" ##上传进分支 git push origin master || pause "git push origin master ..." echo "line:$NUM $dir init repositories ok!!!" CNT=`expr $CNT + 1`; cd $parent_path || pause "cd $parent_path" continue else echo "line:$NUM $dir is not exists!!!" fi done echo "successful init count: $CNT" echo "check done!!" exit 0
保存并赋予执行权限
repo_update.sh
可以删减些执行功能,先确定路径文件内哪些文件夹存在,根据需要哪些需要新建。
运行此脚本前一定要确定路径文件与实际拟创建的仓库地址一致,否则后续不太好操作。
cat 路径文件 | ./repo_update.sh
等进度吧,巴拉巴拉。
~~
所有都完成后,repo仓库就新建成功了,但是:
我们还缺少repo仓库需要的manifest文件
老规矩,还是脚本
这个脚本和一键上传差不太多
#!/bin/sh pause(){ echo $1 echo "exec fail!!!" exit 1 } PRO_DIRS=$1 parent_path=`pwd` echo "dir:"$parent_path NUM=0 CNT=0 MANIFESTS_FILE=$parent_path/default.xml PROJECT_DIR=项目源码目录绝对路径,验证有效性用 ##write head echo "write head.." echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <manifest> <remote name=\"repo仓库名字\" fetch=\".\" review=\"gitmngr@localhost git地址\" /> <default revision=\"master分支\" remote=\"repo仓库名字\" sync-j=\"8\" /> ">$MANIFESTS_FILE echo "write project path and neme..." while read dir; do NUM=`expr $NUM + 1`; if test -d $PROJECT_DIR/$dir then CNT=`expr $CNT + 1`; echo "<project path="\"$dir\"" name="\"$dir\"" />">>$MANIFESTS_FILE continue else echo "line:$NUM $dir is not exists!!!" fi done echo "write tail.." echo " </manifest> ">>$MANIFESTS_FILE echo "write count: $CNT" echo "write done!!" exit 0
cat 路径文件 | ./generate_manifest.sh
执行成功后会在当前目录生成一个default.xml文件
检查这个xml文件,查看哪些需要linkfile属性和copyfile属性,这些属性是在你repo sync时,会对应的执行拷贝和链接动作的,我们项目源码根目录内的文件就是从其他地方链接/拷贝过来的,否则可能后续repo sync差文件或者编译出错(重要,非常重要)
git clone git@xxxxxxx:项目/manifests.git
将生成后并修改过的default.xml文件放入这个克隆的目录内,然后,上传:
git add -A && git commit -m "init commit manifests"
git push
OK~差不多了,开始测试我们的结果了。
我们在客户端新建一个文件夹,进入内运行:
repo init -u git@xxxxxxx:项目/manifests.git
大功告成~进入漫长的等待吧,然后收获喜悦
码字不易,转载请注明~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。