6

我的任务是将我们的存储库从公共 github 移动到我们本地网络上的私有 github 实例。

我的想法是移动它们

git clone --bare <github-repo-url>
git push --mirror <local-github-url>

在过渡期间,我应该能够从爸爸 github 上的存储库中自行更新镜像。(或者我会吗?我还没有在 UI 中找到执行更新的命令。)

然后我会删除“权威”的github仓库,镜像就变成权威了。

但这是怎么发生的?是否每个开发人员都需要更改 .git/config 中“origin”的 url?

镜像会接受不是来自其克隆父更新的推送吗?

4

2 回答 2

5

你的过程几乎是完美的。唯一的问题是--mirror初始克隆上缺少一个参数。

# create the private repo
ssh private-server
mkdir -p /path/to/shared/repos
git init --shared={whatever makes sense for your environment} /path/to/shared/repos/internalrepo.git
exit
# go to github.com and make the public repo readonly
# create a local mirror
git clone --bare --mirror $Github-URL github.git
# now the local repo github.git contains all the stuff from the github repo
cd github.git
git push --mirror $Private-URL
# Tell all developers to execute `git remote set-url origin  $Private-URL`
# Done

我不会让 github 存储库对更改开放,因为项目中的每个人都不清楚哪个存储库现在是正确的存储库。如果您在 server-repo 上运行,您仍然可以这样做

ssh private-server
cd /path/to/shared/repos/internalrepo.git
git remote add --mirror github $Github-URL

然后定期(例如在 cron 工作中)

git fetch github # get new commits from github
git remote prune github # drop branches, which are now deleted in the github repo

编辑

您也可以使用本地镜像进行交换。但是没有简单的自动化过程,因为 git 既不能决定如何处理已删除的分支,也不能决定如何处理分歧的分支。所以你需要保留一个工作存储库,定期从以前的 github-repo 获取东西,从内部 repo 获取东西,解决不同的历史并将这些东西推回内部 repo。

于 2012-04-27T17:30:45.813 回答
0

最简单的过程是开发人员克隆新的(私有)存储库并从那里继续。
如果他们在以前的存储库中有任何未决的更改,他们可以将这些更改导出为补丁并将它们应用到新的本地克隆存储库中,然后再将它们推回新的origin. (请参阅' ' 和 ' '之间有什么区别?git format-patchgit diffgit format-patchman

于 2012-04-27T05:55:39.203 回答