本指南介绍如何将 git 存储库从 ChiliProject 服务器镜像到 GitHub。可以进行双向镜像,两种方式将在不同的章节中介绍,这样只需要一种方式的人就可以忽略另一种方式。
“推送”方向(将更改从 ChiliProject 服务器镜像到 GitHub)以(近乎)同步的方式在 ChiliProject 服务器上的存储库中的后接收挂钩中完成。“拉取”方式(将更改从 GitHub 获取到 ChiliProject 服务器)通过 cronjob 实现,因此是异步的。请注意,如果您主要在 GitHub 存储库上工作,这意味着存储库在每次运行 cronjob 之间可能会在短时间内出现分歧,如果您主要在 ChiliProject 存储库上工作,则不会发生这种情况,因为推送到 ChiliProject 存储库的更改也会立即推送到 GitHub。
可以将 ChiliProject 安装中的变化通知给您的 ChiliProject 的方法与此处描述的同步方法相结合,但这不是本操作指南的一部分。
一个 GitHub 帐户,
托管你的 ChiliProject 安装和你想要镜像到/从 GitHub 的 git 存储库的服务器,
服务器上的存储库应该是空的,
有关如何创建 ssh 密钥的基本知识。
仅当您需要从 ChiliProject 存储库推送到 GitHub 存储库或者想要从私有 GitHub 存储库提取时,才需要此步骤。
根据您的安全需求和/或管理团队的规模,您可以选择为您的 ChiliProject 服务器创建一个 ssh 密钥并将其上传到您的帐户,这样您的服务器在 GitHub 存储库上将拥有与您相同的权限,或者您可以在 GitHub 上创建使用部署密钥,即为您需要在 GitHub 上访问的每个存储库创建一个 ssh 密钥,每个密钥只能访问一个存储库。
无论哪种方式,在 ChiliProject 服务器上运行同步到/与 GitHub 的用户都需要一个~/.ssh目录来存储 ssh 密钥和配置。如果您的用户被调用www-data并且没有权限在其主目录中创建目录,您可以创建它(以 root 身份):
mkdir ~www-数据/.ssh
chmod 700 ~www-data/.ssh
chown www-data ~www-data/.ssh
登录到您的服务器或更改为将执行同步到 GitHub 的用户。例如,如果此用户是 www-data,请运行(以 root 身份):
su - www-数据
-s /bin/bash如果您的系统抱怨缺少登录 shell 或帐户当前不可用,请附加此命令。
通过运行以下命令为该用户创建一个 ssh 密钥:
ssh-keygen
当询问保存密钥的路径时,保留默认设置并按回车键,将密码留空(再按回车键 2 次)。
接下来,将公钥安装到您的 GitHub 帐户。上一个命令输出公钥的路径(查找类似“您的公钥已保存在 /path/to/id_rsa.pub”的行)。将此文件的内容复制到您的 GitHub 帐户的SSH 公钥部分。另请参阅GitHub 的设置 git 帮助页面中的项目 4。“将您的 SSH 密钥添加到 GitHub” 。
仅当您需要每个存储库的 ssh 密钥而不是所有存储库的一个 ssh 密钥时,才需要此步骤。
GitHub 提供了一种无需创建名为deploy keys的额外 GitHub 帐户即可获得对存储库的身份验证访问权限的方法,我们可以利用该帐户为各个存储库创建 ssh 密钥。我不会详细介绍不同步骤的原因,因为如果您需要这种级别的安全性,您应该对 ssh 和 linux 了如指掌。假设运行同步的用户是www-data,要同步的存储库的名称是some-repo
登录到您的服务器或更改为将执行与 GitHub 同步的用户:
su - www-数据
为该用户的存储库创建一个命名的 ssh 密钥:
ssh-keygen -f ~/.ssh/some_repo
将密码留空。
按照GitHub 帮助将生成的公钥添加到目标仓库的部署密钥中。
将以下几行添加到~/.ssh/config执行同步的用户:
主机 some-repo-github.com
身份文件 /path/to/www-data-home/.ssh/some-repo
主机名 github.com
用户 git
GitHub 远程的 URL 将采用以下形式:
如果您不需要身份验证:(这是您在GitHub 向您显示的地址部分https://github.com/thegcat/some_repo.git中找到的地址)http
如果您仅使用一个密钥进行身份验证:(这是您在GitHub 显示的地址部分git@github.com:thegcat/some_repo.git中找到的地址)ssh
如果您使用每个存储库密钥进行身份验证:(some-repo-github.com:thegcat/some_repo.git这是您在 GitHub 显示的地址部分中找到的地址,ssh其中用户已被删除,主机已被替换为用户 ssh 配置中定义的主机)
进入存储库并将远程添加为镜像:
git remote add --mirror github 网址
请注意,已知存在这样的问题:在公共 GitHub 存储库的镜像中,拉取请求会显示为提交。GitHub 知道这一点,但认为这个问题还不足以修复公共存储库(私有存储库有解决方法可以避免这种情况),我们也知道这一点,一旦我们确认了该问题的解决方案,我就会更新此操作指南。另请参阅#527了解更多信息。
如果您首先使用 GitHub repo,则应该将本地 repo 与其同步:
git 获取 github
最简单的方法是将 post-receive 钩子添加到您的本地存储库:每次推送到存储库时,它都会自动推送到 GitHub。如果您还没有 post-receive 钩子,请复制示例:
cp hooks/post-receive.sample hooks/post-receive
此文件必须是可执行的!然后为其添加推送到 github: