如何从zip文件中克隆git仓库

64

我想在github上克隆一个远程仓库,但它很大且我的连接似乎不够稳定,因此无法成功克隆。

但我已成功下载了该仓库的.zip文件。

有没有办法使用这个zip文件作为通过git clone创建的文件,以便我可以进行推送、拉取等操作呢?


你接受了一个答案,但它真的有效吗?在我看来,“clone --bare…”仍然会下载大量内容。 - Benny Bottema
是的,但这相当于下载zip文件。顺便说一句,你应该在答案上发表评论,而不是在问题上 :) - Lesto
5个回答

43

这里的相关帖子(链接)提供了获取.git目录所需的信息,并简化了 umläute 给出的答案:

  • 通过克隆一个裸仓库来获取.git目录

$ mkdir repo
$ git clone --bare http://github/user/repo repo
  • 创建 .git 目录并移动克隆的文件

  • $ mkdir repo/.git
    $ mv repo/* repo/.git
    
  • 解压存储库

    $ unzip repo.zip
    
  • 重新初始化存储库

    $ cd repo
    $ git init
    
  • 验证您已同步

  • $ git pull
    
  • 重置 HEAD 来清理状态

  • $ git reset HEAD
    
  • 这里是存储库的日志... 存储库位置 - http://github.com/udacity/fullstack-nanodegree-vm

  • $ git log
    commit ebcbda650bc81d7f4856f5314a0689cea5b43086
    Merge: 574774b b5b787e
    Author: Karl Krueger <karl@udacity.com>
    Date:   Tue Apr 7 11:39:54 2015 -0700`
    
            Merge pull request #3 from pmallory/sharedDirAlert
    
            Add a login alert to explain how to access Vagrant's shared directory
    
    commit b5b787efdb1ecec0c3c9c7f9c0fd4732f984fcb3
    Author: Philip Mallory <philip@udacity.com>
    Date:   Mon Apr 6 15:40:32 2015 -0700`
    
           move the alert into the motd
    
    commit b8012f33c86b0d19fc4c2b972af092e88d00978f
    Author: Philip Mallory <philip@udacity.com>
    Date:   Mon Apr 6 14:32:01 2015 -0700`
    
           Add a login alert to explain how to access Vagrant's shared directory
    
    commit 574774ba29ccd661154431d5600240f090440c37
    Author: Lorenzo Brown <lorenzo@udacity.com>
    Date:   Wed Mar 11 14:08:02 2015 -0700`
    
           Update pg_config.sh
    
           Added installs for Auth&Auth
    
    commit 88fc5537b1a0017a1d76af4587a22412473809a4
    Author: Lorenzo Brown <lorenzo@udacity.com>
    Date:   Wed Mar 4 13:00:25 2015 -0800`
    
           Update and rename vagrant to vagrant/catalog/README.txt
    
    commit f978cdc14c62b7295d8da1a95452faaa1bd108b8
    Author: Lorenzo Brown <lorenzo@udacity.com>
    Date:   Wed Feb 4 11:06:03 2015 -0800`
    
           Update Vagrantfile
    
           switched to port forwarding on 8080
    
    commit d6a3a26578ef3c6d01d28abca76d817938892c7f
    Author: Lorenzo Brown <lorenzo@udacity.com>
    Date:   Tue Feb 3 14:52:34 2015 -0800`
    
           Update Vagrantfile
    
           Added:
    
           config.vm.network "forwarded_port", guest: 80, host: 8080
           config.vm.network "forwarded_port", guest: 5000, host: 5000
    
           FSF uses these two ports for lessons 2 & 3 respectively.
    
    commit 752a79e408c7328ef7f1766d1b97bb468ffed90a
    Author: Mike Wales <michael.wales@udacity.com>
    Date:   Mon Feb 2 11:21:29 2015 -0800`
    
           Removed .vagrant directory
    
    commit 5af9d19adf9ab19b1d886f6cc78e556f864b42dd
    Author: Mike Wales <michael.wales@udacity.com>
    Date:   Mon Feb 2 11:16:45 2015 -0800`
    
           Initial commit.
    

    那么init看到你已经有关于repo的数据了?但基本上你会失去所有历史记录,就像深度为0的克隆一样,对吧?我会尝试这个方法,如果有效的话,我会接受它作为正确答案。谢谢! - Lesto
    嗨@lesto。是的,**init**看到了关于repo的现有数据,但据我所知,历史记录仍然包括在内(不像简单的克隆)。请参见我上面的示例,我获取了[udacity/fullstack-nanodegree-vm][1]的zip文件,按照过程操作,然后显示日志,其中反映了此分支的所有更改。[1]:http://github.com/udacity/fullstack-nanodegree-vm - fracjackmac
    忘了提到 @o172.net 下面的评论非常有帮助,可以弄清楚___裸___仓库的真正含义。 - fracjackmac
    你有日志历史记录,但是你能否检出旧版本?它在离线模式下可导航吗?我不认为如此,但对于这个请求来说已经足够了。抱歉,但我仍然需要自己检查,但你的答案可能会帮助很多。 - Lesto

    16

    如果您已下载存储库(包括.git目录),那么它非常简单。

    • 解压缩存储库

    $ unzip repo.zip
    
  • 在你的代码仓库中配置一个指向克隆URI的远程

  • $ cd repo
    $ git init
    $ git remote add origin https://github.com/user/repo.git
    
  • 重新同步存储库

  • $ git pull
    

    实际上,从github下载的“zip”文件不会包含.git目录,所以这并没有帮助:-(

    可能最好的方法是在可以稳定访问的机器上克隆,然后将.git目录压缩并以某种方式获取它....


    尝试过从工作中下载,但仍然没有成功...唉,不过我可以尝试从http://...下载.git文件夹,所以接受为答案。 - Lesto
    实际上,从GitHub下载的“zip”文件似乎不包含.git目录。它们以前不是这样的吗? :( - endolith
    3
    实际上,从Github下载的“zip”文件似乎不包含.git目录,因此这并没有帮助。那留下这个答案有什么意义呢? - Anwar
    为什么.git目录是必需的? - Adam
    @Adam 因为.git目录包含实际的git存储库(与给定提交的文件不同)。 - umläute

    15

    虽然被采纳的答案可行,但这种方法更为简单直接。

    unzip <repo>.zip
    cd <repo>
    git init
    git add .
    git remote add origin https://github.com/<user>/<repo>.git
    git remote update
    git checkout master
    

    请确保将 <user><repo> 替换为您的 Github 用户名和仓库名称 ;)


    这些步骤很有效。此外,我还需要使用allow-unrelated-histories选项进行git merge以保持仓库更新。 - devsaw
    这不是与 umläute 相同的答案吗? - Adam
    不对。Umlaute的回答无效,这个有效。问题在于zip文件没有git历史记录。这个解决方案在本地创建了一个git历史记录,然后从远程更新它。 - Arctelix
    2
    @arctelix 我尝试了你的和被接受的解决方案。但是在两种情况下,当我执行git remote update或git pull时,就像在被接受的解决方案中一样,它开始重新接收整个项目,并从0开始接收对象。那么下载zip文件的整个意义就变得无关紧要了。 - Tee
    @Tee 你试过 git fetch 吗?因为那只是获取元数据。 - Hadi Pawar
    如果你在最后一步收到了这个错误 error: Your local changes to the following files would be overwritten by checkout:,你可以先提交再进行checkout,这对我来说有效。 - Mohamed ElSawaf

    3
    唯一类似于zip的克隆替代方案是交换"捆绑包", 但恐怕github不提供捆绑包的创建/下载。
    从Github下载的zip归档只是您的存储库历史记录中一个特定提交(通常是分支的顶端)的快照,并且它不包含任何历史记录。此功能旨在自动为代码库的用户(而不是开发人员!)提供一种方便地下载项目源代码快照的方法。请注意,仅仅是用户和说,将您的软件打包给操作系统的下游维护者通常不会克隆整个历史记录,而是使用tarball。
    换句话说,下载zip归档的工作方式就像在远程端运行git archive然后传递给您结果文件一样。
    还要注意,在Github(以及其他Git托管提供者)上托管的存储库是“裸”的,即它们不包含“.git”子目录。
    在任何情况下,似乎解决此问题的唯一方法是找到一个快速可靠的链接并使用它进行初始下载。
    但是请注意,如果您可以接受没有完整历史记录的情况下,事情会发生变化。您可以通过向git clone传递“--depth”命令行参数来使用所谓的“浅克隆”。

    1
    NB:一个“bare”仓库基本上就是.git目录。 - helloPiers

    0

    根据您的使用情况,初始化可能不是最好的选择。如果存储库非常大(我的存储库为16GB并且我需要这样做),这将特别繁琐,并且实际上会清除本地refs+objects,如果您的归档表示一个远程不存在的归档,则不好。

    您需要复制存储库分为两步:

    1. “数据文件”(可能未暂存的HEAD修订版)
    2. 索引和对象即历史记录+refs+objects:这记录了您的基线、增量、分支指针和标记。

    目标是减少必须从远程克隆的对象数量或无法从不存在的远程重新创建的对象数量。此外,您希望您的配置不与最初创建存储库的人的本地配置文件冲突

    您希望保留对象和引用的存储库布局,这些存储库不再存在于远程或者您不想复制它们(例如它们是大型图像资产)。因此,您不想初始化和拉取,特别是如果您没有远程了。

    相反,存储库已处于可接受的状态,具有完整的引用和对象。唯一的问题可能是远程设置不正确,您的配置可能设置不当。

    运行git config --local -l以验证提交身份在存储库中未本地设置,并更改任何键,这些键会以您不想要的方式覆盖全局设置。

    现在它已经配置好了,将存储库视为自己的(因为它就是),Git被设计为分布式工作,因此一旦您修改了任何本地配置,它实际上与克隆没有区别。唯一剩下的事情是确保您的远程设置正确。

    如果您没有远程但希望创建一个,请使用git init --bare在远程服务器上创建一个,然后像往常一样添加远程并推送所有引用git push --all。使存储库变为裸存储库意味着它将接受第一个推送,而不会抱怨发散的历史记录。

    如果您有现有的远程存储库,请将其添加为远程存储库并拉取。存档分支可能指向错误的URL,具体取决于存档制作的时间,如果是这种情况,请使用git remote将它们分配给新位置或删除任何无效的URL。

    一旦设置了远程,就可以使用fetch和pull来获取最新的更新。如果存在分离的HEAD,请检出所需的分支。如果存档库的历史记录与远程不同,git将产生合并冲突,请像平常一样解决,并在必要时隐藏更改。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接