初学git&repo的种种

经过各种折腾之后,发现git其实还是很简单的;

首先你需要两台机器,一台作为服务器,一台作为开发机器,开发机器从服务器上拉取代码。

目录

git建仓

开发机器拉取代码

初始化仓代码

repo管理

repo工具的下载

repo同步时,无法访问google或者离线,则可以从国内源或者拷贝一份已经有的

repo同步时,出现账号问题,添加ssh账号

manifest文件的书写


git建仓

在服务器上创建一个文件夹,使用git init 或者 git  init --bare来初始化这个文件夹。这个文件可以命令为file或者file.git,都可以,总之是一个文件夹。

如上图所示,创建两个文件夹git-bare与git-nobare; 然后分别初始化。

不使用bare的方式会在文件夹下创建一个隐藏的.git文件,而使用bare的方式,则没有.git,却有一堆文件,而这堆文件与前者的.git中的文件是一样的。

因此,bare的方式就是将我们的文件设置为了git的工作目录,而非bare则不然;因此大部分时候都用bare得方式。后面会说明使用非bare方式遇到的问题

开发机器拉取代码

到这里我们就完成了git服务端的设置,接着看开发端。使用如下方式,就可以拉取一份代码了。

git clone dongjian@192.168.147.134:/home/dongjian/cc/git22
git clone dongjian@192.168.147.134:/home/dongjian/cc/git22/.git

git clone ssh://dongjian@192.168.147.134:22/home/dongjian/cc/git22/.git
git clone ssh://dongjian@192.168.147.134:22/home/dongjian/cc/git22/

可以用git clone 也可以使用git clone ssh, 他们的方式稍有不同,但是都可以下载;然后末尾的文件名,可以是文件夹自己的名字,也可以是下一级的.git名字,总之都是可以的。

使用git remote -v可以看到服务器端这个仓具备fetch与push两个功能。也就是我们既可以拉取代码,也可以push代码到这个仓里。

但是要注意,使用不同的下载方式的仓的地址是不一样的,如下图,origin后面就是地址,可见差别

初始化仓代码

接着我们看看怎么把服务器端的仓填满。只是初始化仓,里面是空的,因此要将最初的代码填入。

我们在开发机器上,先创建一个空文件夹,将自己的源代码放在这个文件夹中,然后使用git init将其初始化;然后执行如下命令,其他前面两条命令会耗时很长。

git status .
git add .
git commit -m "init a repo"
git remote add origin dongjian@192.168.147.134:/home/dongjian/cc/git-nobare/
git push -u origin master


git remote add  origin意思是关联一个远程的仓,然后把本地的代码push到这个仓,这样来完成服务器端仓的代码填充。

我们也可以直接在服务器端的仓里面解压源码,执行add和commit两步即可。他其实就是一个压缩过程。执行完成后,可以将源码删除;而压缩后的文件则是被git隐藏起来了。但是这种情况执行git status的时候,就会出现delte的标记,所以还是按照上面那种操作比较好

如果传输一半没有成功,怎么办呢,删除origin

git remote rm origin

bare与非bare差异

在服务端初始化一个非bare的仓,然后push的时候就出现问题了

$ git push -u origin master
Counting objects: 14276, done.
Delta compression using up to 6 threads.
Compressing objects: 100% (13999/13999), done.
Writing objects: 100% (14276/14276), 18.46 MiB | 177.00 KiB/s, done.
Total 14276 (delta 3248), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To gerrit@192.168.147.136:/home/gerrit/cc/mygit/gitnobare
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'gerrit@192.168.147.136:/home/gerrit/cc/mygit/gitnobare'

 按照log中的描述,需要将服务器的git设置一下属性;

可以直接编辑.git/config,新增 denyCurrentBranch = ignore;

也可以运行命令 

 git  config receive.denyCurrentBranch ignore

总之从左边变成右边这个样子

然后再执行

git push -u origin master

就会发现能够push上去了

这个时候,我们使用git branch -a, 我们会发现,在push之前与push之后的差别:

在初始化完成之后,就可以把旧仓删掉,然后重新拉取代码作为开发分支了

这个时候我们发现,git branch -a的结果又不一样了

我们看到有->的这种表达方式,我们可以通过如下方式去push代码了

git push origin  HEAD:refs/for/master

repo管理

repo工具的下载

$curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

repo同步时,无法访问google或者离线,则可以从国内源或者拷贝一份已经有的

前面文章成功下载高通代码_高通源码下载-CSDN博客

提到过怎么下载高通代码,下载完成后,根目录下会有一个.repo,拷贝过来用即可

repo同步时,出现账号问题,添加ssh账号

如下命令用户名@远端服务器地址

ssh-copy-id gerrit@192.168.10.1

manifest文件的书写

首先在你的源码的根目录下创建一个manifest.git的文件,然后在这个文件中创建一个default.xml的文件;一定要是default.xml这个名字; 之后,这个manifest.git文件夹也要git init, 做成一个仓。

default.xml的内容其实就是名字与地址的关联。 我们学习qcom的manifest的时候,就会发现path是必不可少的。

可以看到qcom对无数的子文件夹进行建仓;大概近700个仓;所以有脚本可以对自己的代码这么搞,但是我没有;我用两个文件夹来做实验

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote fetch="/home/gerrit/cc/android" name="android" review="qcom.com"/>
  <default remote="android" revision="master"/>
  <project name="platform/kernel4.14" path="platform/kernel4.14"/>
  <project name="platform/bootable" path="platform/bootable"/>
</manifest>

如上图,除了remote和default,下面的project就是name和path,只要这个路径对了,那么就能够从远端repo sync同步下代码来。

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YouthTravel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值