背景
有時候我們需要在開源代碼的基礎上做一些修改抽高,
但這些特定的修改又不需要合并到開源代碼中。
這時候將代碼克隆到本地就是一個比較常見的做法了透绩。
一個辦法是翘骂,在本地建一個倉庫,將代碼克隆下來帚豪,然后提交到本地倉庫碳竟,
這樣并不能保留開源代碼的歷史提交記錄。
另一個辦法是狸臣,采用鏡像克隆的方式來做莹桅,本文就記錄一下做法。
鏡像克隆
我們拿 cnpmjs.org 舉例
(1)在 github 上建立私有庫
倉庫地址為:https://github.com/thzt/cnpmjs.org
(2)從原地址克隆一份裸版本庫
$ git clone --bare https://github.com/cnpm/cnpmjs.org.git
值得注意的有兩點:
其一固棚,這里加上了 --bare
參數(shù)
其二统翩,跟普通克孪裳痢(./cnpmjs.org
)不同的是,裸克隆會默認克隆到 ./cnpmjs.org.git
文件夾中厂汗。
(3)以鏡像推送的方式上傳代碼
$ git push --mirror --force https://github.com/thzt/cnpmjs.org.git
記得 push 的遠程地址為 https://github.com/thzt/cnpmjs.org.git
日志如下委粉,這個操作會把所有 branch 和 tag 也都推送過去。
Enumerating objects: 10410, done.
Counting objects: 100% (10410/10410), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3687/3687), done.
Writing objects: 100% (10410/10410), 2.81 MiB | 333.00 KiB/s, done.
Total 10410 (delta 6308), reused 10410 (delta 6308)
remote: Resolving deltas: 100% (6308/6308), done.
To https://github.com/thzt/cnpmjs.org.git
* [new branch] 1.x -> 1.x
...
* [new branch] sync-check-after-10mins -> sync-check-after-10mins
* [new tag] 0.1.0 -> 0.1.0
...
* [new tag] 3.0.0-rc.45 -> 3.0.0-rc.45
(4)結果如下
克隆到 gerrit
以上方式除了可以將代碼鏡像克隆到 gihub 之外娶桦,也可以克隆到 gerrit贾节。
不過,gerrit 中還需要增加一些額外的配置衷畦。
(1)在 gerrit 中新建倉庫
右上角點擊 “CREATE NEW” 新建倉庫(只有管理員才能看到這個按鈕)
填寫倉庫名 cnpmjs.org栗涂,其他字段保持默認值不變
(2)給 gerrit 倉庫配置額外的權限
- Forge Author Identity
- Push(Allow pushing with or without force)
(3)裸克隆后,以鏡像方式上傳代碼到 gerrit
$ git clone --bare https://github.com/cnpm/cnpmjs.org.git
$ git push --mirror --force $GerritRepoPrefix/cnpmjs.org
其中 $GerritRepoPrefix
是 gerrit 地址前綴祈争,每個公司的 gerrit 私有部署地址是不同的斤程。
日志如下,
Enumerating objects: 31, done.
Counting objects: 100% (31/31), done.
Delta compression using up to 8 threads
Compressing objects: 100% (9/9), done.
Writing objects: 100% (18/18), 3.15 KiB | 3.15 MiB/s, done.
Total 18 (delta 12), reused 12 (delta 8)
remote: Resolving deltas: 100% (12/12)
remote: error: branch refs/meta/config:
remote: Cannot delete project configuration from 'refs/meta/config'
remote: User: ...
remote: Contact an administrator to fix the permissions
remote: Processing changes: refs: 2, done
remote: commit 819a499: warning: subject >50 characters; use shorter first paragraph
To .../cnpmjs.org
+ 759d9dc...99b81f5 master -> master (forced update)
! [remote rejected] refs/meta/config (cannot delete project configuration)
error: failed to push some refs to '.../cnpmjs.org'
發(fā)現(xiàn) master 推送成功了菩混,但是 refs/meta/config
沒有推送成功忿墅。
這是沒問題的,是因為 refs/meta/config
是 gerrit 特有的 ref沮峡,是不能刪除的疚脐。
(因為是將原倉庫直接覆蓋過去,gerrit 倉庫中已有的所有 refs/*
都要刪掉再重建)
所以這里應該是 “期望中的正確行為”(It's expected result)邢疙,還可以參考這里棍弄。
(4)上傳成功
(截圖略)