git通过ssh克隆


233

我有一个项目,在上面创建了一个git存储库:

$ cd myproject  
$ git init  
$ git add .  
$ git commit  

我想在另一台机器上创建一个裸克隆:

$ cd ..  
$ git clone --bare myproject  ssh://user@server:/GitRepos/myproject.git  

我执行了克隆,但未打印任何答案。我登录到服务器计算机,并尝试查看文件的存储方式。路径/ GitRepos为空,因此我决定再次进行克隆:

$ git clone --bare myproject  ssh://user@server:/GitRepos/myproject.git

这次的答案是:

致命:目标路径'ssh:// user @ server:/GitRepos/myproject.git'已经存在,并且不是空目录。

但是我看到那条路是空的。
这里发生了什么 ?


我认为跑步git clone --bare不会做您认为会做的事。
沃尔夫,2014年

3
对我而言,ssh://创建了一个文件夹,而不是使用远程协议。使用@ alec-the-geek的答案可以正常工作。您介意为此选择首选答案吗?这是您的工作。
akauppi'3

1
@akauppi:OP负责考虑所有答案,但是他们没有义务选择一个答案,直到满意为止。(当然,提醒他们或询问他们需要什么进一步的信息以使他们接受他们的答案并没有什么
害处

@jvriesem当然。现在将删除“这是您的工作”。但这是旧事了……:)
akauppi 2015年

Answers:


219

这可能与问题没有直接关系。但是我在OP中看到的一个我犯的错误就是URL规范ssh://user@server:/GitRepos/myproject.git-即,在它表示绝对路径后,您同时有一个冒号:和一个斜杠/

然后我找到了Git克隆ssh:无法解析主机名git,开发尼古拉斯·库特勒(这是我在git1.7.9.5版中遇到的错误),并指出:

我最初使用的命令的问题是我尝试使用类似scp的语法。

...这也是我的问题!所以基本上在gitssh,您可以使用

  • ssh://username@host.xz/absolute/path/to/repo.git/ -只是服务器上绝对路径的正斜杠
  • username@host.xz:relative/path/to/repo.git/-仅是一个冒号(ssh://在服务器上不得具有for相对路径(相对于username服务器计算机上的home dir )

希望这对某人有帮助,
干杯!


84
这行不通。如果要使用ssh指定相对路径,则必须丢失ssh://前缀。我只花了20分钟试图解决这个问题。git clone username@host.xz:relative/path/to/repo.git/应该管用。
bobbaluba

2
在Debian 8上使用git 2.1.4进行了尝试。无论哪种处理都不起作用。第一次尝试在/ GitRepos下未创建目录,并且第二次尝试抱怨该路径已存在。就像报告的原始问题一样
dlsa 2015年

5
由于您的评论@bobbaluba(以及最新答案),我也不必为此花费20分钟。谢谢!
olafure

143

对于GitHub上的存储库,请尝试:

git clone ssh://git@github.com/<user>/<repository name>.git

要设置git通过ssh进行克隆,请参见:


<user>是我在github中的用户名还是我在github的电子邮件地址?因为此链接建议我在生成公钥期间使用电子邮件地址。help.github.com/en/github/authenticating-to-github / ...尝试了之后(ssh key gen的空密码),我仍然无法从github克隆仓库。ps我没有将密钥添加到代理。
米妮

同样适用于gitlab。在此之前,我们需要按照您的建议启用SSH密钥设置
Venkataraman R

45

您需要在调用服务器的服务器上运行clone命令。但是我敢打赌,您不是在本地客户端上运行ssh服务器,因此无论如何都无法正常工作。建议您采用这种方法(请查看手册“因为我是从内存中这样做的”)

  1. 登录到服务器计算机。
  2. 使用创建裸仓库 git init --bare
  3. 在客户端计算机上,您可以将您的存储库推送到服务器。git remote add origin ssh://user@server:/GitRepos/myproject.git其次是git push origin master

好建议!给一些新手(像我一样)的注释,这些新手以前没有处理过纯服务器git文件夹:2. cd / GitRepos; mkdir myproject.git; 在git init --bare之前输入cd myproject.git。您在这里不会获得工作副本-存储库文件和文件夹(通常在.git中)将为您裸露,因此标记的名称。谢谢
akauppi

2
“ git init --bare”不会创建.git目录。它将文件直接放在文件夹中。当添加远程源时,我得到:“”致命:不是git存储库(或任何挂载点/ home的父目录)在文件系统边界停止(未设置GIT_DISCOVERY_ACROSS_FILESYSTEM)。
dlsa

10

免责声明:这只是bobbaluba发表的评论的一个副本,使以后的访问者更容易看到。它对我的帮助比其他任何答案都大。


作为示例ssh://时,您必须删除前缀git clone

git clone git@github.com:owner/repo.git

5

试试这个。

第1步:

ls -al ~/.ssh

在此处输入图片说明

第2步:

ssh-keygen 

(使用Enter键作为默认值) 在此处输入图片说明 第3步:设置配置文件

vim /c/Users/Willie/.ssh/config

主机gitlab.com主机名
gitlab.com
用户git
IdentityFile〜/ .ssh / id_rsa

第4步:

git clone git@gitlab.com:<username>/test2.git

在此处输入图片说明

步骤5:
完成步骤4
1.将test2.git文件下载完成
2.您将在〜/ .ssh中获得新文件(known_hosts)
在此处输入图片说明

PS:我自己创建了id_rsa和id_rsa.ub,并将其交付给Gitlab服务器。使用任何客户端(Windows和Linux)的两个键。


4

Git 101:

git是一个分散的版本控制系统。您不需要服务器即可启动并使用git运行。看起来还不错,您可能还是想这样做,对吗?(如果要在多台计算机上处​​理单个项目,这也很有用。)

因此,要使“服务器”运行,您需要先运行,git init --bare <your_project>.git因为这将创建一个空的存储库,然后您可以将其导入计算机中,而无需在您的配置文件中乱搞.git目录。

此后,您可以在应该工作的客户端上克隆存储库,但是我发现某些客户端(即git-gui)将无法克隆完全为空的存储库。要解决此问题,您需要运行cd <your_project>.git && touch <some_random_file> && git add <some_random_file> && git commit && git push origin master。(请注意,如果您以前没有这样做,则可能需要为该机器的git配置用户名和电子邮件。实际运行的命令将出现在您收到的错误消息中,因此我将忽略它们。)

因此,此时您只需运行即可将存储库克隆到任何计算机git clone <user>@<server>:<relative_path><your_project>.git。(正如其他人指出的那样,ssh://如果您使用绝对路径,则可能需要给它加上前缀。)这假设您已经可以从客户端登录到服务器。(ssh如果您打算将大量内容推送到远程服务器,则您还将获得用于设置配置文件和密钥的奖励积分。)

一些相关的链接:
这几乎告诉您您需要了解的内容。
这是给那些了解git基本工作原理但有时忘记确切语法的人的。


这两个链接现在似乎都已消失,或者未显示您期望的链接。
Todd

2

我想尝试一个包含git-flow和三个“点”或用例,git中央存储库,本地开发和生产机器的答案。 这没有很好的测试

我正在给出难以置信的特定命令。<your folder>我不说,而是说/root/git。我更改原始命令的唯一地方是用替换我的特定服务器名称example.com。我将解释文件夹的用途,以便您可以相应地进行调整。请让我知道任何混乱,我将更新答案。

服务器上的git版本是1.7.1。服务器是CentOS 6.3(最终版)。

开发机器上的git版本是1.8.1.1。这是Mac OS X 10.8.4。

中央存储库和生产计算机位于同一台计算机上。

svn用户可以将其关联为“服务器”的中央存储库配置如下。我有一个文件夹/root/git,其中存放所有的git存储库。我想为一个名为“ flowers”的项目创建一个git存储库。

cd /root/git
git clone --bare flowers flowers.git

git命令给出了两条消息:

Initialized empty Git repository in /root/git/flowers.git/
warning: You appear to have cloned an empty repository.

完全不用担心。

在开发机器上的配置如下。我有一个/home/kinjal/Sites存放所有项目的文件夹。我现在想获取中央git存储库。

cd /home/kinjal/Sites
git clone root@example.net:/root/git/flowers.git

这使我可以开始向其中添加内容。我首先设置git flow

git flow init -d

默认情况下,它在分支上develop。我现在在这里添加我的代码。然后,我需要提交到中央git存储库。

git add .
git commit -am 'initial'
git push

在这一点上,它推到了发展分支。我还要将此添加到master分支。

git flow release start v0.0.0 develop
git flow release finish v0.0.0
git push

请注意,在发布开始和发布完成之间我什么也没做。当我完成发行时,系统提示我编辑两个文件。这将开发分支推向了精通。

在生产站点(与中央git存储库位于同一台机器上)上,我要将存储库放在中/var/www/vhosts/example.net。我已经有/var/www/vhosts

cd /var/www/vhosts
git clone file:///root/git/flowers.git example.net

如果生产机器也将在另一台机器上,则该git clone命令看起来就像在开发机器上使用的命令一样。


1

预先来说,我的GIT技能有点不足。

这将在您的计算机上克隆一个裸存储库,该存储库仅包含其中包含.git隐藏目录的文件夹。执行ls -al,您应该看到.gitcd .git在您的存储库中。

您可以添加自己的意图描述,以便具有更多GIT技能的人可以提供帮助吗?您真正想要做的是什么,而不打算如何计划?


我误解了命令。我所做的是在当前目录下创建一个子目录树ssh:/myproject.git。我以为我要克隆到远程目录,但是命令的真正作用是从存储库克隆。
2011年

0

我做了:git clone --bare“ / GITREPOSITORIES / RepoA”“ ssh:// luc @ EERSTENASDS119J / volume1 / RepoA”结果:致命:目标路径'ssh:// luc @ EERSTENASDS119J / volume1 / RepoA'已经存在并且是不是一个空目录。

系统在我的当前路径中创建了目录ssh:// luc @ EERSTENASDS119J / volume1 / RepoA。

因此git clone不会解释URL规范。使用了Alec的解决方法。


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.