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

eyu*_*elt 6 git github

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

根据GitHub帮助页面导入外部Git存储库,将现有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
Run Code Online (Sandbox Code Playgroud)

但是,无论何时在GitHub上创建新存储库,空的存储库页面都会提供有关如何导入现有存储库的不同指令集.它说只需将原始回购推送到GitHub.该页面提供以下命令序列.

git remote add origin git@github.com:ghuser/repo.git
git push -u origin master
Run Code Online (Sandbox Code Playgroud)

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

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

小智 2

大概的区别在于,如果您刚刚创建了一个新的存储库,则没有任何与其关联的现有数据(引用、标签等),因此只需将(相对)空的存储库推送到GitHub像这样:

\n\n
git push -u origin master\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

push --mirror

\n\n

来自Pro Git 书籍第 2.6 章 Git 基础知识 - 标记 \xc2\xa7 共享标签(重点是我的):

\n\n
\n

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

\n
\n\n

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

\n\n
\n

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

\n
\n\n

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

\n\n

clone --bare

\n\n

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

\n\n
\n

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

\n
\n\n

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

\n\n
\n

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

\n
\n