此文章是分为Git搭建和repo搭建,以及repo Android仓库的创建
Git搭建公用版代码服务器
apt-get install git
确保ssh已经正常安装并使用。
useradd -m git
apt-get install python-setuptools
git config --global user.name "S905-server"
git config --global user.email "S905-server"
查看成功与否则是:cat ~/.gitconfig 这里是root查看,如果不是root,相应目录即可。
mkdir一个目录。
git clone https://github.com/res0nat0r/gitosis.git
进入到gitosis目录。
python setup.py install
创建密匙。
ssh-keygen -t rsa一路回车即可。
mkdir ~/tmp
cp ~/.ssh/id_rsa.pub ~/tmp
sudo -H -u git gitosis-init< ~/tmp/id_rsa.pub
对于其他git的服务器需要把id_rsa.pub放到如下目录下:
/home/git/repositories/gitosis-admin.git/gitosis-export/keydir
并把名字修改成pub格式文件的末尾名字。
然后加入到authorized_keys下在/home/git/.ssh
同时用cat /home/smb-share/id_rsa.pub >> authorized_keys
Git客户端搭建
apt-get install git ,git-core,curl.
git config --global user.name "S905-client"
git config --global user.email "S905-client"
ssh-keygen -t rsa
生成的密匙拷贝到server中。
/home/git/repositories/gitosis-admin.git/gitosis-export/keydir
在/home/git/.ssh
同时用cat /home/smb-share/id_rsa.pub >> authorized_keys
git clone git@IP :DIR
如果我后期增加一个 allen 到gitosis 系统中,以后访问免密码
在 allen 命令 ssh-keygen -t rsa 生成key 过程中敲 enter 键,不要输入密码
把 allen 生成 id_rsa.pub 拷贝到服务端如上。
/home/git/repositories/gitosis-admin.git/gitosis-export/keydir
cat /home/smb-share/id_rsa.pub >> authorized_keys
修改gitosis.conf文件最后面增加 下面 一段文字
[group apps]
writable = apps
members =...allen
表示增加一个 仓库(名字为apps)
writable = apps 可读可写
可以被访问的成员有 allen
git 的具体操作详见操作文档。
Repo server 搭建- 公共代码库
开始使用git-daemon-run,经常出现问题。如下时用法。
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
这是git-daemon-run 的使用时的配置。
修改/etc/sv/git-daemon/run
#!/bin/sh
exec 2>&1
echo 'git-daemon starting.'
exec chpst -ugitdaemon \
"$(git --exec-path)"/git-daemon --verbose --reuseaddr \
--base-path=/var/lib /var/lib/git
修改为如下:
--export-all --base-path=/PATH /PATH
--export-all 则是导出共享所有目录,否则需要在每个要导出的目录下做如下操作:
#touch git-daemon-export-ok
--base-path 是映射目录,后边的PATH是镜像目录。
PATH=/home/s905x/code/Android7.1/
在manifest.git/config 中追加如下几行:
[daemon]
uploadpack=true
uploadarch=true
receivepack=true
随便一个path
git clone /home/s905x/code/Android7.1/s905x-innopro/905x-7.0-repo/.repo/manifests.git
git branch -a
remotes/origin/default
remotes/origin/matser
git checkout remotes/origin/default
git checkout -b master
修改后,git add ,git commit
git push --all
在服务器中切换到 master,如有了,则是git branch -D master,
然后在git push --all
修改.repo/manifests/default.xml
fetch:则是url fetch+name是每个git的地址。Name则是每个远程仓库的名字。
master则是git push --set-upstream 后创建的分支。
name与fetch一起用,patch则是从仓库同步代码时放的位置。
另外一种的用法则是:apt-get install git-daemon-sysvinit
git-daemon-sysvinit配置为:/etc/default/git-daemon
GIT_DAEMON_ENABLE=true
GIT_DAEMON_USER=git
GIT_DAEMON_BASE_PATH=/opt/server
GIT_DAEMON_DIRECTORY=/opt/server
# Additional options that are passed to the Daemon.
GIT_DAEMON_OPTIONS="--export-all --enable=upload-pack --enable=upload-archive --enable=receive-pack --informative-errors"
制作仓库:
在指定文件下,git init --bare manifest.git
然后在别的地方clone ,把default.xml放到该文件下,修改OK后,git add ,git commit 即可。
git push --set-upstream /home/s905x/code/server/manifest.git master
cat n-amlogic_openlinux-20170222-ott.xml | cut -d '"' -f 4 > repos_201796.txt
vim repos_201796.txt删掉其中空格,Makefile,以及其他。
创建repos_201796.sh,777 如下
#/bin/bash
set -x
set -e
pwd=${PWD}
cd /opt/server
while read line; do
if [ -z "$line" ]; then
echo $work_dir not exist !!!!!!!!!! 1>&2
continue
fi
sleep 1
git init --bare $line.git
chown -R git:git $line.git
sleep 1
echo ==== $line
pwd
执行cat repos_201796.txt | . repos_201796.sh
删除源码中的所有.git和.svn
find ./* -name ".git"| xargs rm -rf
find ./* -type d -empty 查找所有的空文件。
在repo的管理中,很多空文件没办法加进去,只能在空文件里创建.gitkeep和.gitignore
在.gitignore中加入!.gitkeep
创建脚本,自动化复制。
#/bin/bash
set -x
set -e
cd /home/code/s905x/905x-7.0-repo
pwd=${PWD}
workdir=$1
while read line; do
if [ -z "$line" ]; then
echo $work_dir not exist !!!!!!!!!! 1>&2
continue
fi
workdir=$pwd/$line
echo ==== $workdir
cp /home/smb-share/.gitkeep $workdir -arf
cp /home/smb-share/.gitignore $workdir -arf
pwd
done
制作脚本repoinit_201796.sh,并拷贝到不带有任何.git和.svn的源代码下。
cat n-amlogic_openlinux-20170222-ott.xml | cut -d '"' -f 2 > src_201796.txt
#/bin/bash
set -x
set -e
cd /home/code/s905x/905x-7.0-repo
para1=
work_dir=$1
pwd=${PWD}
while read line; do
line1=${line%%/*}
if [ -z "$line" ]; then
echo $work_dir not exist !!!!!!!!!!!! 1>&2
continue
fi
if [ $(ls -A $pwd/$line | wc -l) -eq 0 ]; then
echo $work_dir empty !!!!!!!!!!!! 1>&2
continue
fi
workdir=$pwd/$line
echo ==== $workdir
cd $workdir
rm -rf .git
git init . 1>&2
git add . -f 1>&2
git commit -m "Initial commit" 1>&2
sleep 1
if [ "$line1" = "device" ]; then
git push --set-upstream /opt/server/$line.git master
sleep 1
elif [ "$line1" = "vendor" ]; then
git push --set-upstream /opt/server/$line.git master
sleep 1
else
git push --set-upstream /opt/server/$line.git master
sleep 1
fi
cd -
done
cat src_201796.txt | . src_201796.sh
以上搭建的中心则是在目录下创建仓库,然后分别提交文件。Amlogic的经过处理的,大部分文件被放到platform中。不晓得好处在哪里。
/etc/init.d/git-daemon start|restart|stop
repo client
然后在另外一台电脑上测试和安装
apt-get install phablet-tools
在/usr/bin/repo
REPO_URL = 'https://gerrit-googlesource.lug.ustc.edu.cn/git-repo'
REPO_URL = /home/gitadmin/gitCfg/git-repo.git //待测试。
#REPO_URL = 'git://192.168.2.37/905x-7.0-repo/git-repo'
repo init -u git://192.168.2.37/905x-7.0-repo/.repo/manifests.git -m default.xml -b default
repo sync
repo start s905x --all
将每一个的project都设置远程仓库别名。
如下脚本:
#/bin/bash
set -x
set -e
pwd=${PWD}
cd /home/code/s905x/build
while read line; do
if [ -z "$line" ]; then
echo $work_dir not exist !!!!!!!!!! 1>&2
continue
fi
sleep 1
repo forall $line -c git remote add $line git://192.168.2.14/$line
sleep 1
echo ==== $line
pwd
done
如此操作后,提交代码则
以下是我管理项目中常用的命令:不给出具体使用方法,实践出真知
git add /git commit -a -m
git log /git status/git diff
git reset HEAD /git checkout file
git branch /-a/-r
git branch name
git branch -d name 删除
git branch -m name1 name2
远程分支的创建删除
git remote -v/ git remote add name URL
git push name name1:name2 此时则是 name2就是在仓库里的了。
git push name :name2 则是删除name2的分支。
或者用git push name --delete name2
git formate-patch
git 可以打包zip或者差分文件
至此远程分支创建,当我们git clone 或者repo init 都加个 -b name则是下载的是name的分支。
下载则是直接repo sync ,如果未同步过则是执行同步,如果同步过,则是执行更新。
repo start name --all 这里创建的是xml文件的原始环境
repo branch
repo abandon branchname
repo status
repo forall project -c git remote -v
git remote 用于显示远程主机。-v 用于显示网址。
git remote add + name + URL 是用来指定主机名字。
git branch -a , git branch name
git fetch origin master 远程主机有更新,更新到本地。主机名和分支。
git push :
git pull --rebase :
repo forall -c 'git remote add mykorg /pub/gittrees/our-repository/\
$REPO_PROJECT.git $@'
repo forall -c git push myorg master-2.1_r2:refs/heads/master-2.1_r2
repo 的基本操作详见文档。
Error 总结
Error1 :
pack: aborting due to possible repository corruption on the remote side.
remote: aborting due to possible repository corruption on the remote side.
fatal: early EOF
fatal: index-pack failed
在.git config中加入
[pack]
window = 0
代码获得后要建立branch
Error2 :
error: inflate: data stream error (incorrect data check)B/s
fatal: pack has bad object at offset 26259705: inflate returned -3
error: Cannot fetch prebuilts/go/darwin-x86
则是在server中删掉.git
重新做git init --bare $project.git
git push --set-upstream /home/s905x/code/server/manifest.git master
Error3:prebuilts/qemu-kernel
fatal: The remote end hung up unexpectedly
fatal: protocol error: bad pack header
在manifest.xml中去掉clone =1