如何让Git克隆到当前目录


499

我正在做:

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

我越来越:

致命:目标路径“。” 已经存在,并且不是一个空目录。

我知道路。已经存在。而且我可以确保目录为空。(我在里面做ls,什么也看不见!)

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


16
如果您这样ls -a做,会看到.git目录吗?
戴文·崔顿

2
@dtryon-不。但是无论如何我都会看到一个DS_Store。也许我应该摆脱它。谢谢你-a:s
MEM 2012年

@感谢您的快速回复。James Maclaughlin看起来很漂亮,可以确保我们克隆到一个空目录。:)
MEM 2012年

1
我假设您使用的是Mac。这是否对您有帮助?stackoverflow.com/questions/107701/…–
戴文·崔顿

值得一提的是,在Mac上浏览到的所有文件夹都将在其中创建这些小文件。这对于使用相同共享的Windows用户以及需要将文件夹为空或以编程方式对文件夹中的每个文件执行操作的任何系统(例如git)都非常烦人。
jsims281 2012年

Answers:


508

只需在其旁边放置一个点

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

来自git help clone

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

因此,请确保目录为空(使用选中ls -a),否则命令将失败。


18
同意,请注意,在Mac上,finder会自动创建一个.DS_Store文件,它将阻止该克隆。与ls -la
ptim

281
不。这不是正确的答案。这仍然会返回“致命:目标路径'。” 已经存在,并且不是一个空目录。”
Sid Sarasvati 2013年

16
使用git v1.8.3.2为我工作。@SidSarasvati您确定当前目录为吗?
Wesley Baugh,2014年

3
@SidSarasvati对我来说不错,directoy不是空的,但是我不在乎,所以我不确定为什么Git会这么做。为什么git无法克隆到非空目录?当然,它只是基本下载。
内森·霍恩比

3
mkdir创建硬链接到...通过默认设置,以便为新的目录在基于Unix的系统在技术上的“空”,在所有?我的意思是,我想您可以unlink .unlink ..但是如果您在克隆后忘记重新链接的话,那可能会在以后给您带来巨大的问题。–
SeldomNeedy 2015年

351

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

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

就我而言,这将生成一个.git/config文件,该文件与执行克隆时得到的文件等效。


40
此外,这是一种使当前内容得以保留的咒语-例如,是否将点文件克隆到主目录中。
rbellamy 2014年

7
有了它,我终于可以克隆到我喜欢的任何文件夹中,而Git不会像对待婴儿一样对待我。当我还添加了一个临时.gitignore包含*(忽略所有内容)时,git checkout master即使该文件夹中已经有其他文件了,我也可以执行。然后克隆存储库中所有提交的文件(临时的.gitignore被仓库中的.gitignore覆盖)。一切都很棒。它应该通过使用git clone -f或其他方式自行发生。
PaulMag 2014年

1
如果您有不同/新/更改的文件将被覆盖(...文件将被checkout覆盖...正在终止),请使用:git checkout master -f
visualex15 2015年

3
-t \*是不必要的,因为它是默认值。
Palec

1
git remote set-head origin -a可能会派上用场。它将原始来源的默认分支(refs/remotes/origin/HEAD)设置为在远程存储库中设置的位置。git clone不像那样自动执行此操作git remote add -f
Palec

211

@Andrew 在这里已明确回答。但是,即使目录不为空,也是如此简单:

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

我很高兴确认<repository-url>您也可以作为本地回购交易git remote add origin /path/to/existing/repo
krubo,

60

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

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

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

克隆完成后,您可以将目录移至所需位置:

mv project_hub /path/to/new/location

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


9
这将在现有/path/to/new/location目录中创建一个子目录,这当然不是问题的重点。
PavelŠimerda'16

然后,您将不得不手动移动隐藏的文件或使用复杂的命令...而它不能回答问题。
黑色


48

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

目录必须为


16

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

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

git版本: 2.21.0


13

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

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

1
就我而言,它甚至可以处理“。”中的某些文件。目录
OSdave 2012年

2
请注意,foo下目录中的所有dotfiles,例如。foo / bar / .foobar不会与此命令一起移动。参见@phatblat的答案
lea

11

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

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

通过使用以下命令确保您的当前目录为空

ls -a

今天面临这个问题。原来,我在要将存储库克隆到的目录中隐藏了.git和.gitignore文件夹。当我删除这些文件夹时,一切正常。
塔马拉2015年

清空当前目录的命令是什么?我认为这将比仅检查它更有用:)
pie6k '16

9

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

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

致谢:@James McLaughlin,评论如下。


10
这看起来很邪恶,因为。*包含父目录!我:〜/ tmp / tmp / tmp $ ls -d .* . .. 我:〜/ tmp / tmp / tmp $
stackunderflow 2013年

这无济于事,因为我在需要检出的目录中具有依赖项。
2014年

18
我不确定将rm -rf(以任何形式)写入没有任何真正可怕警告标志的SO答案是否明智。一些经验不足的用户可能会来这里寻找“绿色复选标记”(通常是最佳答案),然后复制并粘贴此命令,然后poof ...在当前目录中将继续他的辛苦工作。顺便说一句:rm -rf ./.*如果您只是删除当前目录下的隐藏(点)文件和目录(就像我之前说过的@stackunderflow),则“安全”。但是rm -rf对于没有经验的用户来说,这是一个危险的命令,因此请小心使用!只是我的2美分。
安德鲁(Andrew)

可以在1.7.1上运行里面的唯一文件夹是.git在之后git init(我知道)
vladkras

您无需-rf删除普通文件。请考虑删除此答案或至少接受其他答案。
纳文

6

改善@GoZoner的答案:

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

shopt命令是从该SO答案中获取的,并将Bash上的'mv'命令的行为更改为包括点文件,您需要包括.git目录和任何其他隐藏文件。

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


6

我有同样的需求。就我而言,我有一个由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的文件保存在某个你拉回购将在包含git的文件父创建。这发生在我身上,我为此感到惊讶;-)

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

这似乎是“克隆”到非空目录的一种简便方法。如果您不希望通过pull创建.git和.gitignore文件,只需在pull之后将其删除。


5

@phatblat的答案的进一步改进:

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

作为一个班轮:

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


2
shopt -s dotglob
git clone ssh://user@host.com/home/user/private/repos/project_hub.git tmp && mv tmp/* . && rm -rf tmp

3
提供更多信息,以解释您的代码为何可解决此问题及其作用。
马丁

“ git clone ... tmp”-在执行命令的目录中创建/ tmp文件夹,并克隆Git存储库。然后是“ mv tmp / *”。-将所有文件从父文件夹中的/ tmp文件夹(已执行上一个命令的位置)中移动,最后移至“ rm -rf tmp”-删除/ tmp文件夹。
马林斯基

1

在命令末尾使用。(点),如下所示

git clone URL


这在Mac上不起作用,会导致错误: fatal: destination path '.' already exists and is not an empty directory.
Pedro Luz

对于mac ::您应该在父目录下,然后使用文件夹名称而不是。(点),如下所示 git clone URL flodername 确保您的文件夹为空。
Upendra

0

这是我发现的:

我看到了:

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

以上是我的问题,只是提升对我有用。


0

rm -rf。*

可能会给您带来麻烦或其他错误。

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

rm -rf /路径/到/文件夹/ *


0

因此,我通过删除根目录中隐藏的.git文件夹,然后在'git clone repo'中添加了句点来解决此错误。在我的根目录/ dist文件夹中。这是在vue-cli Webpack项目的上下文中。所以其他人说的都是对的,这通常意味着您正在尝试克隆到的文件夹中或有问题的文件夹的父文件夹或根目录中都有git跟踪!


0

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


0
git clone ssh://user@host.com/home/user/private/repos/project_hub.git $(pwd)

请注意,这仍然会导致在问题中发布相同的错误(“ 致命:目标路径'resolved / path / of / pwd'已经存在,并且不是空目录。 ”)如果您在非空目录中执行此操作目录。
Gino Mempin


-1

通过创建一个新文件mkdir filename,然后运行的命令很有用git clone xxxxx,它确实可以在我的计算机上工作


-1

只需删除(或移动).git给定目录的内容,包括目录。
诸如Android Studio之类的自动化工具Rebuild将为您解决问题。

更多详细信息:
为我显示的错误是由于显示的jarresolvergit repo
路径是temp\jarresolver\

我只是删除了temp\jarresolver\目录的内容,包括隐藏的.git目录。

就这样,一切正常,无需克隆。
当我这样做时Rebuild,Android Studio克隆自身并构建成功。


-2

我已经看过很多次这个问题了-我只想指出,git pull从您的目录中可以解决问题。

除非我在这里缺少任何东西,否则对我有用。


4
git pull如果您没有定义存储库,则不会执行任何操作,这是操作的关键部分git clone
hackel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.