如何让Git克隆到当前目录

MEM*_*MEM 456 git git-clone

我正在做:

git clone ssh://user@host.com/home/user/private/repos/project_hub.git ./
Run Code Online (Sandbox Code Playgroud)

我越来越:

致命:目的地路径'.' 已存在且不是空目录.

我知道道路.已经存在.我可以保证目录是空的.(我在里面做,我什么都看不见!)

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

小智 470

只需在它旁边放一个点

git clone git@github.com:user/my-project.git .
Run Code Online (Sandbox Code Playgroud)

来自git help clone:

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

因此请确保目录为空(请检查ls -a),否则命令将失败.

  • 不.这不是正确的答案.这仍将是"致命的:目的地路径".已存在且不是空目录." (265认同)
  • 同意,请注意,在mac上,finder自动创建的.DS_Store文件将阻止克隆.检查`ls -la` (18认同)
  • 使用git v1.8.3.2为我工作.@SidSarasvati你确定当前目录是*空*? (14认同)
  • @SidSarasvati对我而言对我来说并不是空洞的,但我并不在意,所以我不确定为什么Git会这样做.为什么不能将git克隆到非空目录中?当然,它只是一个基本的下载. (3认同)
  • `mkdir`默认创建`.`和`..`的硬链接,所以在基于Unix的系统中技术上是一个新的目录"空"?我的意思是,我猜你可以`unlink .`和`unlink ..`但如果你忘记在克隆后再次重新链接,那么这可能会导致你以后遇到大问题.... (2认同)
  • 克隆到空目录几乎没用,您也可以删除目录本身并通过克隆重新创建它.在我看来,正确的答案将不得不解决非空目录. (2认同)
  • 你有没看过这个问题?OP已经尝试过了.他正在寻找一种适用于非空目录的解决方案. (2认同)

And*_*ner 341

在所有情况下,以下内容可能并不完全等同于克隆,但对我来说是诀窍:

git init .
git remote add -t \* -f origin <repository-url>
git checkout master
Run Code Online (Sandbox Code Playgroud)

在我的例子中,这会生成一个.git/config文件,该文件与我在进行克隆时获得的文件相同.

  • 此外,这是允许保留当前内容的咒语 - 例如,如果您将dotfiles克隆到主目录中. (38认同)
  • 有了这个,我终于被允许克隆到我喜欢的任何文件夹而不用Git像对待婴儿那样对待我.当我还添加了一个包含`*`(忽略所有内容)的临时.gitignore时,我可以执行`git checkout master`,即使该文件夹中已有其他文件.然后克隆了存储库中的所有提交文件(临时.gitignore被来自repo的正确.gitignore覆盖).这一切都很精彩.它应该通过使用`git clone -f`或其他东西来实现. (7认同)
  • `-t\*`是不必要的,因为它是默认值. (2认同)

amb*_*bes 195

@Andrew显然已经回答了这里.但即使目录不为空,这也很简单:

git init .
git remote add origin <repository-url>
git pull origin master
Run Code Online (Sandbox Code Playgroud)

  • 这应该是OP的公认答案 (8认同)
  • 我很高兴确认 `&lt;repository-url&gt;` 也可以是本地存储库,如 `git Remote add origin /path/to/existing/repo` (2认同)

eck*_*kes 59

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

git clone ssh://user@host.com/home/user/private/repos/project_hub.git
Run Code Online (Sandbox Code Playgroud)

这将把你的东西克隆到一个project_hub目录中.

克隆完成后,您可以在任意位置移动此目录:

mv project_hub /path/to/new/location
Run Code Online (Sandbox Code Playgroud)

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

  • 这将在预先存在的`/ path/to/new/location`目录中创建一个子目录,这当然不是问题的关键. (8认同)

ret*_*.at 52

git clone your-repo tmp && mv tmp/.git . && rm -rf tmp && git reset --hard
Run Code Online (Sandbox Code Playgroud)


NSu*_*nny 34

git clone https://user@bitbucket.org/user/projectname.git .
Run Code Online (Sandbox Code Playgroud)

目录必须为

  • 这个答案看起来是 /sf/answers/1347072751/ 的重复 (2认同)

GoZ*_*ner 13

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

git clone <repository> foo; mv foo/* foo/.git* .; rmdir foo
Run Code Online (Sandbox Code Playgroud)

  • 请注意foo下目录中的任何dotfiles,例如.使用此命令不会移动foo/bar/.foobar.请参阅@phatblat的答案 (2认同)

Jak*_*hao 11

除了@ StephaneDelcroix的答案之外,在使用之前:

git clone git@github.com.user/my-project.git .
Run Code Online (Sandbox Code Playgroud)

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

ls -a
Run Code Online (Sandbox Code Playgroud)


MEM*_*MEM 8

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

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

积分转到:@James McLaughlin,评论如下.

  • 我不确定将rm -rf(以任何形式)写入SO答案而没有一些真正的警告标志是明智的.一些没有经验的用户可能会来这里寻找"绿色复选标记"(通常是最好的答案),然后复制粘贴这个命令和poof ......他在当前目录中努力工作.BTW:`rm -rf ./.*`如果你只是删除当前dir下的隐藏(点)文件和目录(就像我之前说的@stackunderflow)那么"更安全".但是`rm -rf`对于没有经验的用户来说是一个危险的命令,所以要小心它!只需2美分. (16认同)
  • 这看起来很邪恶,因为.*包括父目录!我:〜/ tmp/tmp/tmp $`ls -d.*``...我:〜/ tmp/tmp/tmp $ (10认同)
  • 您不需要“-rf”来删除普通文件。请考虑删除此答案或至少接受另一个答案。 (3认同)

166*_*MMX 7

进一步改进@phatblat 的回答

git clone --no-checkout <repository> tmp \
  && mv tmp/.git . \
  && rmdir tmp \
  && git checkout master
Run Code Online (Sandbox Code Playgroud)

作为一个班轮:

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


pha*_*lat 6

改进@ GoZoner的答案:

git clone <repository> foo; shopt -s dotglob nullglob; mv foo/* .; rmdir foo
Run Code Online (Sandbox Code Playgroud)

shopt命令取自此SO答案并更改Bash上'mv'命令的行为以包括dotfiles,您需要包含.git目录和任何其他隐藏文件.

另请注意,如果当前目录(.)为空,则只保证按原样运行,但只要克隆的repo中的所有文件都与当前目录中的文件同名,它就会起作用.如果您不关心当前目录中的内容,可以在"mv"命令中添加-f(强制)选项.


Rex*_*ker 6

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

git clone https://github.com/myself/myRepo.git temp
cp -r temp/* .
rm -rf temp
Run Code Online (Sandbox Code Playgroud)

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


小智 5

我有同样的需要.在我的例子中,我有一个标准的Web文件夹,它是由Web服务器安装创建的.出于这个例子的目的,让我们说这是

/server/webroot

和webroot包含其他标准文件和文件夹.我的repo只有网站特定的文件(html,javascript,CFML等)

我所要做的就是:

cd /server/webroot

git init

git pull [url to my repo.git]
Run Code Online (Sandbox Code Playgroud)

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

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

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

  1. 如果一个git的文件某处父路径到您的文件夹拉回购将在包含git的文件父创建.这发生在我身上,我很惊讶它;-)

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

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


Nic*_*aly 5

嗯...指定绝对电流路径$(pwd)对我有用。

git clone https://github.com/me/myproject.git $(pwd)
Run Code Online (Sandbox Code Playgroud)

git版本: 2.21.0