将现有Git存储库导入GitHub的这些方法之间的差异?

时间:2013-07-08 00:53:44

标签: git github

我的服务器上有一个本地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

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

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

1 个答案:

答案 0 :(得分:2)

据推测,差异在于 如果您刚刚创建了一个新的仓库,那么您没有任何与之相关的现有数据(引用,标签等),所以只需按下它即可。 (相对)空回购GitHub ,如下:

git push -u origin master

然而, 如果您要导入已经存在一段时间的现有仓库,您可能希望推送其拥有的任何现有数据(标签等) git push默认情况下,如果没有--tags--mirror选项,则不会执行此操作。

push --mirror

来自Pro Git book Chapter 2.6 Git Basics - Tagging § Sharing Tags(强调我的):

  

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

您自己引用的GitHub帮助页Importing an external Git repository解释了--mirror选项的用途,如此强调(强调我的):

  

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

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

clone --bare

至于clone --bare选项的目的,它可能再次与您可能导入已存在一段时间的旧现有仓库并且已经包含数据的事实有关到一个新的回购。 Importing an external Git repository解释如下:

  

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

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

  

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