【问题标题】:Clone only the .git directory of a git repo仅克隆 git repo 的 .git 目录
【发布时间】:2021-04-11 23:53:39
【问题描述】:

我有一个与 google Drive 同步的 repo,但我忽略了 .git 目录,因此它现在已上传到 Google Drive。

最近我格式化了我的 Gentoo 机器,在我再次同步所有 Google Drive 文件后,我意识到 .git 目录不存在。

问题是我不记得我是否在本地有一些未标记/未提交的更改未推送到 github。

我一直在搜索,但只找到了相反问题的答案(没有.git 目录的克隆)

在我确定可能的本地更改不会丢失之前,我不想为我的仓库创建 git clone

有没有什么方法可以只克隆.git 文件夹,然后推送我机器中可能有的任何本地更改?

【问题讨论】:

    标签: git github version-control


    【解决方案1】:

    一步解决方案是:

    git clone --no-checkout <repo_url>
    

    或者如果你已经有一个空目录,

    cd myrepo
    git clone --no-checkout <repo_url> .
    

    【讨论】:

    • git clone --no-checkout &lt;repo_url&gt; myrepo =)
    • 如果你的目录不为空怎么办?
    • 如果你的目录不为空,git 不会进行克隆。但是,如果您想要目录中的内容,只需克隆到一个空目录中,然后将您拥有的文件复制到您克隆的目录中。
    • 它不会恢复索引,所以如果你只是将.git目录移动到工作树中git status输出会不正确。
    【解决方案2】:

    我解决了。这是一个简单的过程:

    1. 我已将 repo 克隆到不同的位置,例如(/tmp
    2. 我已将 .git 文件夹复制到我原来的 repo 文件夹中
    3. 我在原来的 repo 文件夹上做了git status,所有本地更改都在那里。

    希望对他人有所帮助

    【讨论】:

    • 这种方法的唯一问题是您没有机会检出特定分支,默认克隆将检出“主”分支,这不是您可能的样子想要将您的本地文件集与进行比较
    • 由于您只需要 .git 文件夹而不是整个工作目录,因此请确保使用 --bare 选项克隆它。
    • @EissaN。使用--bare 选项不会创建远程跟踪分支,因此您无法推送和比较它们。
    【解决方案3】:
    1. git clone 发送到您在线存储库中计算机上的其他文件夹
    2. 签出您有兴趣比较本地文件的分支。
    3. 然后将文件夹内容复制/粘贴到新克隆的顶部。
    4. 检查有什么变化(如果有的话,按照你的意愿提交)。

    【讨论】:

    • 其实我现在解决了xD。我已将 repo 克隆到不同的目录并复制了 .git 目录。现在一切正常!
    • 我应该删除我的问题还是发布我的问题的答案?
    • @algui91:因为有一个投票赞成的答案,所以您不能删除该问题。您可以选择发布您的自我回答,尽管在您将其标记为接受之前会有延迟(我认为是几天)。 OTOH,您所说的与此答案所暗示的非常吻合;你可能应该接受这个答案。
    • 是的,两天。谢谢!
    【解决方案4】:

    基本上你想要的是一个新的.git 目录而不对文件进行任何更改,因此你可以执行git status 并查看是否有任何更改。

    期望您的 pwd 是您的项目目录,其中包含一个旧的 .git 目录,其中设置了存储库的 origin,您可以运行以下命令:

    mkdir -p /var/www/tmp/_delme \
        && git clone --no-checkout `cat .git/config | grep url | awk -F' = ' '{print $2}'` /var/www/tmp/_delme \
        && rm -rf .git \
        && mv /var/www/tmp/_delme/.git . \
        && git add -A
        && rm -rf /var/www/tmp/_delme
    

    【讨论】:

      【解决方案5】:

      正如在另一个答案中所说,git clone 命令有一个--no-checkout 选项,但这不是解决问题的直接或完整解决方案:

      1. 拒绝克隆到非空目录;
      2. 它不会恢复索引(因为目录中应该没有文件)。

      因此,如果您只是将.git 目录移动到工作树中并运行git status,您将得到错误的结果:

      On branch master
      Your branch is up to date with 'origin/master'.
      
      Changes to be committed:
              deleted:    Home.rest
      
      Untracked files:
              Home.rest
      

      话虽如此,有两种方法可以解决这个问题:

      • 使用临时目录克隆:
        $ git clone -n <repo_url> tmp
        $ mv tmp/.git/ . && rm -d tmp
        $ git read-tree HEAD
        
      • 使用工作树在现有目录中模仿克隆:
        $ git init
        $ git remote add -m master -f origin <repo_url>
        $ git reset refs/remotes/origin/HEAD
        $ git branch -u origin
        

      如果有更多人使用同一个存储库(还有一些远程更改),您将很难figuring out which state your local repository was in

      另一方面,如果您确定没有本地更改,则只需删除您的工作树并进行完整克隆会更容易:

      $ rm -rf <local_repo_dir>
      $ git clone <repo_url> <local_repo_dir>
      

      【讨论】:

        【解决方案6】:

        如果我有一个名为 local_directory 的目录,我会在 github 中创建一个名为 remote_local_directory 的新存储库。我想将 local_directory 推送到 remote_directory。

        我使用这些命令

        git clone --bare ${remote_directory}.git local_directory/.git
        cd local_directory
        git init
        git add .
        git commit
        git push --set-upstream origin master
        

        git clone --bare 只克隆.git 目录 git init 将重新初始化本地存储库

        使用其他git命令,例如本地存储库与远程相关。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-08-07
          • 1970-01-01
          • 2022-11-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多