【问题标题】:How to get Git to clone into current directory如何让 Git 克隆到当前目录
【发布时间】:2012-04-09 12:28:41
【问题描述】:

我在做:

git clone ssh://user@host.com/home/user/private/repos/project_hub.git ./

我明白了:

致命:目标路径 '.'已经存在并且不是空的 目录。

我知道路径。已经存在。 我可以保证该目录是空的。 (我在里面做 ls 什么也没看到!)

为了将该项目克隆到当前目录,我在这里缺少什么?

【问题讨论】:

  • 如果您执行ls -a,您会看到.git 目录吗?
  • @dtryon - 不。但我看到了一个 DS_Store 无论这是什么。也许我应该摆脱它。谢谢你 -a :s
  • @感谢四位您的快速回复。 James Maclaughlin 似乎是一个漂亮的命令,可以确保我们克隆到一个空目录。 :)
  • 我假设你是on a Mac。这有帮助吗:stackoverflow.com/questions/107701/…
  • 不管怎样,您在 Mac 上浏览到的任何文件夹都会在其中创建这些小文件。对于使用相同共享的 Windows 用户以及需要为空文件夹或以编程方式对文件夹中的每个文件执行操作的任何系统(例如 git)来说,这都非常烦人。

标签: git git-clone


【解决方案1】:

只需在它旁边放一个点

git clone git@github.com:user/my-project.git .

来自git help clone

仅当目录为空时才允许克隆到现有目录。

所以要确保目录是空的(检查ls -a),否则命令会失败。

【讨论】:

  • 同意,请注意,在 Mac 上,finder 自动创建的 .DS_Store 文件将阻止克隆。检查ls -la
  • 不。这不是正确的答案。这仍然会返回“致命:目标路径”。已存在且不是空目录。”
  • 使用 git v1.8.3.2 为我工作。 @SidSarasvati 你确定当前目录是 empty 吗?
  • @SidSarasvati 对我​​来说很好,directoy 不是空的,但我不在乎,所以我不确定 Git 为什么会这样做。为什么不能 git clone 到非空目录?当然功能,它只是一个基本的下载。
  • mkdir 默认情况下会创建指向... 的硬链接,所以在基于Unix 的系统中,一个新目录在技术上是“空的”吗?我的意思是,我猜你可以unlink .unlink .. 但如果你在克隆后忘记重新链接,这可能会给你带来很大的问题......
【解决方案2】:

以下内容可能并不完全等同于所有情况下的克隆,但对我有用:

git init .
git remote add -t \* -f origin <repository-url>
git checkout master

在我的例子中,这会生成一个.git/config 文件,它与我在克隆时得到的文件相同。

【讨论】:

  • 此外,这是允许当前内容保留的咒语 - 假设您将 dotfiles 克隆到主目录中。
  • 有了这个,我终于可以克隆到我喜欢的任何文件夹中,而 Git 不会像对待婴儿一样对待我。当我还添加了一个包含 * 的临时 .gitignore(忽略所有内容)时,即使文件夹中已经有一些其他文件,我也可以执行 git checkout master。然后从存储库中克隆所有提交的文件(临时 .gitignore 被 repo 中的正确 .gitignore 覆盖)。这一切都非常有效。它应该通过使用git clone -f 或其他方式自行发生。
  • 如果您有不同/新/更改的文件将被覆盖(...文件将被结帐覆盖...中止)使用:git checkout master -f
  • -t \* 是不必要的,因为它是默认值。
  • git remote set-head origin -a 可能会派上用场。它设置 origin 的默认分支 (refs/remotes/origin/HEAD),因为它在远程存储库中设置。 git clone 会自动执行此操作,这与 git remote add -f 不同。
【解决方案3】:

@Andrew 已经明确回答了here。但是即使目录不为空,这样简单也可以:

git init .
git remote add origin <repository-url>
git pull origin master

【讨论】:

  • 我很高兴地确认&lt;repository-url&gt; 也可以是本地仓库git remote add origin /path/to/existing/repo
【解决方案4】:

git clone https://user@bitbucket.org/user/projectname.git .

目录必须为

【讨论】:

【解决方案5】:

为确保您可以克隆 repo,请转到任何临时目录并在那里克隆项目:

git clone ssh://user@host.com/home/user/private/repos/project_hub.git

这会将您的内容克隆到project_hub 目录中。

克隆完成后,您可以将此目录移动到任何您想要的位置:

mv project_hub /path/to/new/location

这是安全的,不需要任何神奇的东西。

【讨论】:

  • 这将在预先存在的/path/to/new/location 目录中创建一个子目录,这当然不是问题的重点。
  • 那么你将不得不手动移动隐藏文件或使用复杂的命令......它并没有回答问题。
【解决方案6】:
git clone your-repo tmp && mv tmp/.git . && rm -rf tmp && git reset --hard

【讨论】:

  • 这是一个调整:D
【解决方案7】:

嗯...使用$(pwd) 指定绝对当前路径对我有用。

git clone https://github.com/me/myproject.git $(pwd)

git 版本: 2.21.0

【讨论】:

    【解决方案8】:

    如果当前目录是空的,那么这将起作用:

    git clone <repository> foo; mv foo/* foo/.git* .; rmdir foo
    

    【讨论】:

    • 在我的情况下,它甚至可以使用 '.' 中的一些文件。目录
    • 请注意 foo 下目录中的任何点文件,例如。 foo/bar/.foobar 不会被这个命令移动。查看@phatblat 的答案
    【解决方案9】:

    解决方案: 在这种情况下,解决方案是使用dot, 所以:rm -rf .* &amp;&amp; git clone ssh://user@host.com/home/user/private/repos/project_hub.git .

    如果我们绝对确定目录为空,则可以省略rm -rf .* &amp;&amp;

    学分归于: @James McLaughlin 在下面的 cmets 上。

    【讨论】:

    • 这看起来很邪恶,因为 .* 包含父目录!我:~/tmp/tmp/tmp$ls -d .*. ..我:~/tmp/tmp/tmp$
    • 这没有帮助,因为我在需要结帐的目录中有依赖项。
    • 我不确定将 rm -rf (以任何形式)写入 SO 答案是否明智,而没有一些真正可怕的警告标志。一些没有经验的用户可能会来这里寻找“绿色复选标记”(通常是最佳答案),然后复制粘贴此命令并噗……在当前目录中进行了他的辛勤工作。顺便说一句:如果您只是删除当前目录下的隐藏(点)文件和目录,rm -rf ./.* 会“更安全”(正如我之前所说的@stackunderflow)。但是rm -rf 对于没有经验的用户来说是一个危险的命令,所以要小心!只是我的 2 美分。
    • 适用于 1.7.1 里面唯一的文件夹是 .gitgit init 之后(我知道)
    • 您不需要-rf 来删除普通文件。请考虑删除此答案或至少接受一个不同的答案。
    【解决方案10】:

    除了@StephaneDelcroix的回答,使用前:

    git clone git@github.com.user/my-project.git .
    

    通过使用确保您当前的目录为空

    ls -a
    

    【讨论】:

    • 今天遇到了这个问题。原来我在试图克隆存储库的目录中隐藏了 .git 和 .gitignore 文件夹。当我删除这些文件夹时,一切正常。
    • 清空当前目录的命令是什么?我认为这比检查它更有用:)
    【解决方案11】:

    我也有同样的需要。在我的例子中,我有一个标准的 web 文件夹,它是由 web 服务器安装创建的。为了这个说明的目的,假设这是

    /server/webroot

    并且 webroot 包含其他标准文件和文件夹。我的仓库只有站点特定的文件(html、javascript、CFML 等)

    我所要做的就是:

    cd /server/webroot
    
    git init
    
    git pull [url to my repo.git]
    

    您需要小心地在目标文件夹中执行 git init,因为如果您不这样做,将会发生以下两种情况之一:

    1. 在我的情况下,git pull 将简单地失败并显示关于没有 git 文件的消息:

    致命:不是 git 存储库(或任何父目录):.git

    1. 如果在您的文件夹的父路径中的某处存在一个 .git 文件,您提取的 repo 将在包含该 .git 文件的父级中创建。这发生在我身上,我对此感到惊讶;-)

    这不会影响我在 webroot 文件夹中的任何“标准”文件,但我确实需要将它们添加到 .gitignore 文件中,以防止无意中将它们添加到后续提交中。

    这似乎是一种“克隆”到非空目录的简单方法。如果你不想要 pull 创建的 .git 和 .gitignore 文件,只需在 pull 之后删除它们即可。

    【讨论】:

      【解决方案12】:

      我用它来克隆一个 repo 到当前目录,该目录不是空的。不一定是干净的生活,但它是在一个一次性的码头集装箱里:

      git clone https://github.com/myself/myRepo.git temp
      cp -r temp/* .
      rm -rf temp
      

      在这里,我使用cp -r 而不是mv,因为它会复制隐藏的文件和目录。然后用rm -rf处理临时目录

      【讨论】:

        【解决方案13】:

        进一步改进@phatblat 的answer

        git clone --no-checkout <repository> tmp \
          && mv tmp/.git . \
          && rmdir tmp \
          && git checkout master
        

        作为一个班轮:

        git clone --no-checkout &lt;repository&gt; tmp &amp;&amp; mv tmp/.git . &amp;&amp; rmdir tmp &amp;&amp; git checkout master

        【讨论】:

          【解决方案14】:

          改进@GoZoner 的回答:

          git clone <repository> foo; shopt -s dotglob nullglob; mv foo/* .; rmdir foo
          

          shopt 命令取自 this SO answer,并更改了 Bash 上“mv”命令的行为以包含点文件,您需要包含 .git 目录和任何其他隐藏文件。

          另请注意,只有在当前目录 (.) 为空时才能保证按原样工作,但只要克隆的 repo 中的文件与当前目录中的文件不具有相同名称,它就会工作.如果您不关心当前目录中的内容,您可以在 'mv' 命令中添加 -f(强制)选项。

          【讨论】:

            【解决方案15】:
            git clone ssh://user@host.com/home/user/private/repos/project_hub.git $(pwd)
            

            【讨论】:

            • 请注意,这仍然会导致问题中发布的相同错误(“致命:目标路径'resolved/path/of/pwd'已经存在并且不是空目录。") 如果您在非空目录中执行此操作。
            • 这个解决方案对我在 Mac 上运行 git 版本 2.25.0 确实有效。
            【解决方案16】:

            在命令末尾使用 .(dot),如下所示

            git clone 网址 .

            【讨论】:

            • 这在mac上不起作用,它会导致错误:fatal: destination path '.' already exists and is not an empty directory.
            • 对于 mac :: 你应该在父目录下然后使用文件夹名称而不是 .(dot) 如下所示 git clone URL flodername 确保你的文件夹是空的。
            【解决方案17】:
            shopt -s dotglob
            git clone ssh://user@host.com/home/user/private/repos/project_hub.git tmp && mv tmp/* . && rm -rf tmp
            

            【讨论】:

            • 提供更多信息来解释您的代码解决问题的原因以及它的作用。
            • "git clone ... tmp" - 在执行命令的目录中创建 /tmp 文件夹并克隆 Git 存储库。然后“mv tmp/*”。 - 移动父文件夹中 /tmp 文件夹中的所有文件(之前的命令已在其中执行),最后是“rm -rf tmp” - 删除 /tmp 文件夹。
            【解决方案18】:

            这是我发现的:

            我看到了:

            fatal: destination path 'CouchPotatoServer' already exists and is not an empty directory.
            

            在我的搜索中,我偶然发现:

            https://couchpota.to/forum/viewtopic.php?t=3943

            查找 Clinton.Hall 的条目... 如果你尝试这个(就像我一样),你可能会得到access denied 响应,这是我的第一个线索,所以最初的错误(对我来说)实际上是在逃避错误的根本问题。

            Windows 中的解决方案: 确保运行 cmdgit elevated,然后运行:

            git clone https://github.com/RuudBurger/CouchPotatoServer.git
            

            以上是我的问题,简单地提升对我有用。

            【讨论】:

              【解决方案19】:

              删除

              rm -rf .*

              可能会给您带来麻烦或更多错误。

              如果您有 /path/to/folder,并且想删除其中的所有内容,但不删除该文件夹,请运行:

              rm -rf /path/to/folder/*

              【讨论】:

                【解决方案20】:

                所以我通过删除根目录中隐藏的 .git 文件夹来修复同样的错误,然后在“git clone repo”中添加一个句点。在我的根/dist 文件夹中。这是在 vue-cli webpack 项目的上下文中。所以其他人说的都是对的,这通常意味着您在尝试克隆到的文件夹或相关文件夹的父文件夹或根目录中都有 git 跟踪!

                【讨论】:

                  【解决方案21】:

                  Windows 的解决方案是将存储库克隆到其他文件夹,然后复制并粘贴到原始位置或仅复制 .git 不可见文件夹。

                  【讨论】:

                    【解决方案22】:

                    mkdir filename创建一个新文件很有用,然后运行git clone xxxxx的命令,在我的电脑上就可以了

                    【讨论】:

                      猜你喜欢
                      • 2015-08-13
                      • 1970-01-01
                      • 2012-03-15
                      • 2021-04-11
                      • 1970-01-01
                      • 2013-07-07
                      • 2018-02-17
                      相关资源
                      最近更新 更多