6

我的服务器上有一个本地 Git 存储库,我想将其导入 GitHub。我四处寻找如何做到这一点,遇到了两种不同的方法,都是 GitHub 提供的。

根据 GitHub 帮助页面Importing an external Git repository,将现有 Git 存储库导入 GitHub 的方法是创建原始存储库的临时裸克隆,然后使用“镜像”选项将其推送到 GitHub。该页面提供以下命令序列:

git clone --bare https://githost.org/extuser/repo.git

cd repo.git
git push --mirror https://github.com/ghuser/repo.git

cd ..
rm -rf repo.git

但是,每当您在 GitHub 上创建新存储库时,空的存储库页面都会提供一组不同的关于如何导入现有存储库的说明。它说只需将原始存储库推送到 GitHub。该页面提供以下命令序列。

git remote add origin git@github.com:ghuser/repo.git
git push -u origin master

ghuser/repo在这两种情况下,在执行给定命令之前,GitHub 上应该已经存在空仓库。我看到这两种方法的唯一区别是第一种方法没有为 GitHub 存储库添加远程。

我尝试了两种方法来测试它们,它们都有效。这两个存储库看起来完全一样。这两种方法有什么区别?如果这两种方法效果相同,为什么 GitHub 帮助页面添加了创建 repo 的裸克隆和使用镜像选项的额外步骤?

4

1 回答 1

2

据推测,不同之处在于,如果您刚刚创建了一个新的 repo,则没有任何现有数据(引用、标签等)与之关联,因此只需将(相对)空 repo 推送到 GitHub就像这样是一件简单的事情:

git push -u origin master

但是,如果您要导入一个已经存在一段时间的现有存储库,您可能希望推送它拥有的任何现有数据(标签等),默认情况下,如果没有or选项,这git push将无法执行。--tags--mirror

push --mirror

来自Pro Git 书第 2.6 章 Git 基础 - 标记§共享标签(强调我的):

默认情况下,该git push命令不会将标签传输到远程服务器。创建标签后,您必须将标签显式推送到共享服务器...如果您有很多标签要一次推送,您可以...使用命令--tags选项git push这会将您的所有标签传输到尚不存在的远程服务器。

GitHub 帮助页面导入您自己引用的外部 Git 存储库解释了该--mirror选项的用途,如下所示(强调我的):

使用“镜像”选项将本地克隆的存储库推送到 GitHub,这可以确保将所有引用(即分支、标签等)复制到导入的存储库

您还可以在git-push(1)中阅读有关--tags--mirror选项的更多信息。

clone --bare

至于该clone --bare选项的目的,它可能再次与您可能正在导入一个已经存在了一段时间的旧现有存储库有关,并且与新存储库相比,其中已经包含数据。 导入外部 Git 存储库是这样解释的:

使用外部克隆 URL 对存储库进行“裸”克隆(即数据的完整副本,但没有用于编辑文件的工作目录)。这确保了所有旧数据的干净、新鲜的导出。

这是git clone --bare来自git-clone(1)的解释:

...远程的分支头直接复制到相应的本地分支头,而不将它们映射到refs/remotes/origin/. 使用此选项时,既不会创建远程跟踪分支,也不会创建相关的配置变量。

于 2013-07-08T01:44:52.890 回答