此文章是分为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


09-28 08:20