服務端
本地搭建repo服務器的方法:
首先得確保本地的git能夠正常使用,并下載一個repo可以正常運行
目錄結構如下:
首先新建一個文件夾repo-server,并在其下新建兩個目錄,如上圖所示
在manifest.git文件夾中執行?git?init?初始化一個git?庫并添加default.xml
其中比較重要的是manifest.git文件夾中的default.xml,該default.xml的內容如下:
其中fetch就是你在服務器端所在的位置,可以是遠程的,也可以是本地的,我這里設置的是本地的
客戶端與服務器同步就是依靠這個地址進行repo?sync的
其中default標簽是用來設置分支名和遠端服務器默認名的
接下來的project標簽就是你要通過repo來管理的git庫位置了
添加完畢后執行git?add?-A添加到緩沖區,再通過git?commit?-m?"Init"添加到倉庫中去(這些都是基本的git操作,這里不做詳述)
manifest.git的文件列表
project目錄下git?項目建立
在project1目錄下執行
git?init
git?add?-A
git?commit?-m?"project1?Init"
cd?..
git?clone?--bare?project1?project1.git
查看project目錄下,是否存在project1.git(project1的純凈倉庫)
如果存在則刪除 project1(服務端只保留git純凈倉庫)
在project2目錄下同樣執行上述操作,獲取project2.git
至此,服務端工作已經完成
客戶端
在repo-client文件夾下執行
repo?init?-u?server_path
這個server_path是default.xml所在的目錄路徑
我的server_path是/home/Neo/repo/repo-server/manifest.git
所以我應該執行:
repo?init?-u?/home/Neo/repo/repo-server/manifest.git
如果提示下面的錯誤:
fatal:?Cannot?get?https://gerrit.googlesource.com/git-repo/clone.bundle
fatal:?error?[Errno?101]?Network?is?unreachable
這說明網絡連接有問題,而你確認你網絡沒有問題的話,那就多連幾次吧,會好的(G.F.W)
結果如下:
[root@SVR6?repo-client1]#?repo?init?-u?/home/Neo/repo/repo-server/manifest.git/
Get?https://gerrit.googlesource.com/git-repo
remote:?Counting?objects:?197,?done
remote:?Finding?sources:?100%?(144/144)
remote:?Getting?sizes:?100%?(24/24)
remote:?Compressing?objects:?100%?(246848/246848)
remote:?Total?2401?(delta?202),?reused?2380?(delta?199)
Receiving?objects:?100%?(2401/2401),?1.48?MiB?|?340?KiB/s,?done.
Resolving?deltas:?100%?(1402/1402),?done.
From?https://gerrit.googlesource.com/git-repo
*?[new?branch]??????maint??????->?origin/maint
*?[new?branch]??????master????->?origin/master
*?[new?branch]??????stable????->?origin/stable
*?[new?tag]????????v1.0??????->?v1.0
*?[new?tag]????????v1.0.1????->?v1.0.1
*?[new?tag]????????v1.0.2????->?v1.0.2
*?[new?tag]????????v1.0.3????->?v1.0.3
*?[new?tag]????????v1.0.4????->?v1.0.4
*?[new?tag]????????v1.0.5????->?v1.0.5
*?[new?tag]????????v1.0.6????->?v1.0.6
*?[new?tag]????????v1.0.7????->?v1.0.7
*?[new?tag]????????v1.0.8????->?v1.0.8
*?[new?tag]????????v1.0.9????->?v1.0.9
*?[new?tag]????????v1.1??????->?v1.1
*?[new?tag]????????v1.10.0????->?v1.10.0
*?[new?tag]????????v1.10.1????->?v1.10.1
*?[new?tag]????????v1.10.2????->?v1.10.2
*?[new?tag]????????v1.10.3????->?v1.10.3
*?[new?tag]????????v1.10.4????->?v1.10.4
*?[new?tag]????????v1.11.0????->?v1.11.0
*?[new?tag]????????v1.11.1????->?v1.11.1
*?[new?tag]????????v1.12.0????->?v1.12.0
*?[new?tag]????????v1.12.1????->?v1.12.1
*?[new?tag]????????v1.12.2????->?v1.12.2
*?[new?tag]????????v1.2??????->?v1.2
*?[new?tag]????????v1.3??????->?v1.3
*?[new?tag]????????v1.3.1????->?v1.3.1
*?[new?tag]????????v1.3.2????->?v1.3.2
*?[new?tag]????????v1.4??????->?v1.4
*?[new?tag]????????v1.4.1????->?v1.4.1
*?[new?tag]????????v1.4.2????->?v1.4.2
*?[new?tag]????????v1.4.3????->?v1.4.3
*?[new?tag]????????v1.4.4????->?v1.4.4
*?[new?tag]????????v1.5??????->?v1.5
*?[new?tag]????????v1.5.1????->?v1.5.1
*?[new?tag]????????v1.6??????->?v1.6
*?[new?tag]????????v1.6.1????->?v1.6.1
*?[new?tag]????????v1.6.10????->?v1.6.10
*?[new?tag]????????v1.6.10.1??->?v1.6.10.1
*?[new?tag]????????v1.6.10.2??->?v1.6.10.2
*?[new?tag]????????v1.6.2????->?v1.6.2
*?[new?tag]????????v1.6.3????->?v1.6.3
*?[new?tag]????????v1.6.4????->?v1.6.4
*?[new?tag]????????v1.6.5????->?v1.6.5
*?[new?tag]????????v1.6.6????->?v1.6.6
*?[new?tag]????????v1.6.7????->?v1.6.7
*?[new?tag]????????v1.6.7.1??->?v1.6.7.1
*?[new?tag]????????v1.6.7.2??->?v1.6.7.2
*?[new?tag]????????v1.6.7.3??->?v1.6.7.3
*?[new?tag]????????v1.6.7.4??->?v1.6.7.4
*?[new?tag]????????v1.6.7.5??->?v1.6.7.5
*?[new?tag]????????v1.6.8????->?v1.6.8
*?[new?tag]????????v1.6.8.1??->?v1.6.8.1
*?[new?tag]????????v1.6.8.10??->?v1.6.8.10
*?[new?tag]????????v1.6.8.11??->?v1.6.8.11
*?[new?tag]????????v1.6.8.2??->?v1.6.8.2
*?[new?tag]????????v1.6.8.3??->?v1.6.8.3
*?[new?tag]????????v1.6.8.4??->?v1.6.8.4
*?[new?tag]????????v1.6.8.5??->?v1.6.8.5
*?[new?tag]????????v1.6.8.6??->?v1.6.8.6
*?[new?tag]????????v1.6.8.7??->?v1.6.8.7
*?[new?tag]????????v1.6.8.8??->?v1.6.8.8
*?[new?tag]????????v1.6.8.9??->?v1.6.8.9
*?[new?tag]????????v1.6.9????->?v1.6.9
*?[new?tag]????????v1.6.9.1??->?v1.6.9.1
*?[new?tag]????????v1.6.9.2??->?v1.6.9.2
*?[new?tag]????????v1.6.9.3??->?v1.6.9.3
*?[new?tag]????????v1.6.9.4??->?v1.6.9.4
*?[new?tag]????????v1.6.9.5??->?v1.6.9.5
*?[new?tag]????????v1.6.9.6??->?v1.6.9.6
*?[new?tag]????????v1.6.9.7??->?v1.6.9.7
*?[new?tag]????????v1.6.9.8??->?v1.6.9.8
*?[new?tag]????????v1.7??????->?v1.7
*?[new?tag]????????v1.7.1????->?v1.7.1
*?[new?tag]????????v1.7.2????->?v1.7.2
*?[new?tag]????????v1.7.3????->?v1.7.3
*?[new?tag]????????v1.7.3.1??->?v1.7.3.1
*?[new?tag]????????v1.7.4????->?v1.7.4
*?[new?tag]????????v1.7.4.1??->?v1.7.4.1
*?[new?tag]????????v1.7.4.2??->?v1.7.4.2
*?[new?tag]????????v1.7.4.3??->?v1.7.4.3
*?[new?tag]????????v1.7.5????->?v1.7.5
*?[new?tag]????????v1.7.6????->?v1.7.6
*?[new?tag]????????v1.7.6.1??->?v1.7.6.1
*?[new?tag]????????v1.7.7????->?v1.7.7
*?[new?tag]????????v1.7.7.1??->?v1.7.7.1
*?[new?tag]????????v1.7.7.2??->?v1.7.7.2
*?[new?tag]????????v1.7.7.3??->?v1.7.7.3
*?[new?tag]????????v1.7.7.4??->?v1.7.7.4
*?[new?tag]????????v1.7.7.5??->?v1.7.7.5
*?[new?tag]????????v1.7.7.6??->?v1.7.7.6
*?[new?tag]????????v1.7.8????->?v1.7.8
*?[new?tag]????????v1.7.8.1??->?v1.7.8.1
*?[new?tag]????????v1.7.8.2??->?v1.7.8.2
*?[new?tag]????????v1.8.0????->?v1.8.0
*?[new?tag]????????v1.8.1????->?v1.8.1
*?[new?tag]????????v1.8.2????->?v1.8.2
*?[new?tag]????????v1.9.0????->?v1.9.0
*?[new?tag]????????v1.9.1????->?v1.9.1
*?[new?tag]????????v1.9.2????->?v1.9.2
*?[new?tag]????????v1.9.3????->?v1.9.3
*?[new?tag]????????v1.9.4????->?v1.9.4
*?[new?tag]????????v1.9.5????->?v1.9.5
*?[new?tag]????????v1.9.6????->?v1.9.6
...?A?new?repo?command?(?1.19)?is?available.
...?You?should?upgrade?soon:
cp?/home/Neo/repo/repo-client1/.repo/repo/repo?/bin/repo
Get?/home/Neo/repo/repo-server/manifest.git/
remote:?Counting?objects:?3,?done.
remote:?Compressing?objects:?100%?(2/2),?done.
remote:?Total?3?(delta?0),?reused?0?(delta?0)
Unpacking?objects:?100%?(3/3),?done.
From?/home/Neo/repo/repo-server/manifest
*?[new?branch]??????master????->?origin/master
Your?Name??[root]:
添加完名字和郵件地址即可。
然后這個時候依舊沒有代碼,這是因為代碼還只是存在git庫中,需要執行repo?syn
[root@SVR6?repo-client1]#?repo?sync
...?A?new?repo?command?(?1.19)?is?available.
...?You?should?upgrade?soon:
cp?/home/Neo/repo/repo-client1/.repo/repo/repo?/bin/repo
remote:?Counting?objects:?3,?done.
remote:?Total?3?(delta?0),?reused?0?(delta?0)
Unpacking?objects:?100%?(3/3),?done.
From?/home/Neo/repo/repo-server/project/project1
*?[new?branch]??????master????->?repo-server/master
remote:?Counting?objects:?3,?done.
remote:?Total?3?(delta?0),?reused?0?(delta?0)
Unpacking?objects:?100%?(3/3),?done.
From?/home/Neo/repo/repo-server/project/project2
*?[new?branch]??????master????->?repo-server/master
這時進入project/project1中時通過git?branch查看的時候確是no?branch..
[root@SVR6?project1]#?git?branch
*?(no?branch)
那是因為沒有從確定所取的分支,執行
[root@SVR6?repo-client1]#repo?forall?-c?git?checkout?-b?master?remotes/m/master
...?A?new?repo?command?(?1.19)?is?available.
...?You?should?upgrade?soon:
cp?/home/Neo/repo/repo-client1/.repo/repo/repo?/bin/repo
HEAD?is?now?at?789317b...?create?project1
HEAD?is?now?at?707deec...?create?project2
[root@SVR6?repo-client1]#
這里為什么會是remotes/m/master呢,這是需要查看下,你可以通過repo?forall?-c?git?branch?-a
[root@SVR6?repo-client1]#?repo?forall?-c?git?branch?-a
...?A?new?repo?command?(?1.19)?is?available.
...?You?should?upgrade?soon:
cp?/home/Neo/repo/repo-client1/.repo/repo/repo?/bin/repo
*?(no?branch)
remotes/m/master?->?repo-server/master
remotes/repo-server/master
*?(no?branch)
remotes/m/master?->?repo-server/master
remotes/repo-server/master
#remotes/m/master是這個就是一個repo的清單庫的分支,也就是當你在執行repo?init?-U?[URL]?-b?[branch_name]的時候,-b參數后面的分支。如果你repo?init的 時候,沒有指定過-b參數。那么這里就會顯示remotes/m/master.(m--manifest)
#repo-server/master清單庫里的default.xml里面指定的單個git庫的revision值
#remotes/repo-server/master是遠程分支
[root@SVR6?repo-client1]#
執行完repo?forall?-c?git?checkout?-b?master?remotes/m/master之后再查看分支時:
[root@SVR6?repo-client1]#?repo?forall?-c?git?checkout?-b?master?remotes/m/master
...?A?new?repo?command?(?1.19)?is?available.
...?You?should?upgrade?soon:
cp?/home/Neo/repo/repo-client1/.repo/repo/repo?/bin/repo
Branch?master?set?up?to?track?remote?branch?master?from?repo-server.
Switched?to?a?new?branch?'master'
Branch?master?set?up?to?track?remote?branch?master?from?repo-server.
Switched?to?a?new?branch?'master'
[root@SVR6?repo-client1]#?repo?forall?-c?git?branch?-a
...?A?new?repo?command?(?1.19)?is?available.
...?You?should?upgrade?soon:
cp?/home/Neo/repo/repo-client1/.repo/repo/repo?/bin/repo
*?master
remotes/m/master?->?repo-server/master
remotes/repo-server/master
*?master
remotes/m/master?->?repo-server/master
remotes/repo-server/master
[root@SVR6?repo-client1]#
這樣就完成了簡單repo服務器的搭建
其中repo?forall這個命令的意思是針對repo下所有的git庫進行同樣的操作
repo?forall?-c?后接git命令,比如說你要查看所有git庫中的代碼情況,可以執行repo?forall?-c?git?status
如果你要查看提交狀態,可以執行repo?forall?-c?git?log?--stat
[root@SVR6?repo-client1]#?repo?forall?-c?git?log?--stat
...?A?new?repo?command?(?1.19)?is?available.
...?You?should?upgrade?soon:
cp?/home/Neo/repo/repo-client1/.repo/repo/repo?/bin/repo
commit?789317be88ecdc12b53e4c422016494d636b6b32
Author:?root?
Date:?Thu?Apr?25?15:52:27?2013?+0800
create?project1
0?files?changed,?0?insertions(+),?0?deletions(-)
commit?707deec1441ad98aba3fd845f2de79a708eaeb1c
Author:?root?
Date:?Thu?Apr?25?15:52:51?2013?+0800
create?project2
0?files?changed,?0?insertions(+),?0?deletions(-)
[root@SVR6?repo-client1]#
總結:repo其實就是許多Git倉庫的總管理員,便于管理和操作的一個python腳本,如果不是很大型的項目,用一個git倉庫就好了,如果項目多且大,需要分開管理,那還是使用repo來管理比較好