通过SSH克隆Git

322

我有一个项目,我在其中创建了一个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 不会做你想要的事情。 - Wolfer
3
对我来说,ssh:// 创建了一个文件夹,而不是使用远程协议。使用 @alec-the-geek 的答案使事情得以解决。你介意选择一个首选答案吗?这是你的工作。 - akauppi
1
@akauppi:考虑所有答案是提问者的责任,但在满意之前,他们没有选择答案的义务。(当然,提醒他们或询问他们需要哪些进一步信息才能接受答案也无妨!) - jvriesem
@jvriesem 当然可以。现在可以去掉“这是你的工作”的说法了。但这是一个老问题... :) - akauppi
10个回答

279

这可能与问题无关直接的,但是我刚刚犯了一个错误,在原始问题中也能看到,在URL规范 ssh://user@server:/GitRepos/myproject.git 中有一个冒号 : 和一个斜杠 /,表示绝对路径。

然后我发现了Git clone, ssh: Could not resolve hostname – git , development – Nicolas Kuttler(因为我在git版本1.7.9.5上遇到了错误),注意到:

我最初使用的命令的问题在于我试图使用类似于scp的语法。

... 这也是我的问题!所以基本上在git中使用ssh,你可以使用以下方式之一:

  • ssh://username@host.xz/absolute/path/to/repo.git/ - 服务器上的绝对路径只需斜杠
  • username@host.xz:relative/path/to/repo.git/ - 只需冒号(相对于服务器上username的家目录的相对路径不能有ssh://

96
这不起作用。如果你想用ssh指定相对路径,就必须去掉 ssh:// 前缀。我刚刚花了20分钟才搞清楚这个问题。 git clone username@host.xz:relative/path/to/repo.git/ 应该是可行的。 - bobbaluba
2
尝试在Debian 8上使用git 2.1.4,但无论是哪个建议都不起作用。第一次尝试时,在/GitRepos下没有创建任何目录,在第二次尝试时抱怨路径已经存在。就像原始问题报告所描述的那样。 - dlsa
5
由于你的评论@bobbaluba(以及更新的回答),我无需再花费20分钟来完成这个任务。谢谢! - olafure
git remote add local username@server:~/directory/repository_folder/ 对我来说完美地运行了。 - MrObjectOriented

200

尝试以下方法来获取 GitHub 上的代码库:

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

要设置Git通过ssh进行克隆,请参阅:


这个链接建议我在生成公钥时使用电子邮件地址,那么<user>是我的GitHub用户名还是我的电子邮件地址?尝试后(ssh密钥生成时空白的密码短语),我仍然无法从GitHub克隆存储库。附言:我没有将密钥添加到代理中。 - soMuchToLearnAndShare
同样适用于GitLab。在此之前,我们需要启用SSH密钥设置,就像你建议的那样。 - Venkataraman R

52

您需要在所谓的服务器上运行克隆命令。但是我打赌您没有在本地客户端上运行ssh服务器,因此无论如何都不会起作用。建议您遵循以下步骤(检查手册,因为我是凭记忆做这个)

  1. 登录服务器机器。
  2. 使用 git init --bare 命令创建一个裸版本库。
  3. 在客户端机器上,您可以将自己的版本库推送到服务器上。通过执行 git remote add origin ssh://user@server:/GitRepos/myproject.git 然后执行 git push origin master

太好了!以下是一些针对新手(像我这样)的提示,他们之前没有处理过纯服务器Git文件夹:2. 在git init --bare之前,先cd /GitRepos; mkdir myproject.git; cd myproject.git。在这里你不会得到一个工作副本 - 仓库文件和文件夹(通常在.git中)将为你裸露出来,因此有了该标志的名称。谢谢。 - akauppi
2
"git init --bare" 不会创建 .git 文件夹,而是直接将文件放在目标文件夹中。当我添加远程仓库时,出现以下错误提示:"fatal: Not a git repository (or any parent up to mount point /home) Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)." - dlsa

30

免责声明:这只是对由bobbaluba的评论进行的复制,为了方便未来的访问者而使其更加可见。它比其他任何答案都帮助了我。


当使用git clone示例时,您必须删除ssh://前缀。

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

29

解决该问题的简单方法
请尝试以下步骤。

步骤1:


try this.

Step 1:

ls -al ~/.ssh

输入图像描述

步骤2:

ssh-keygen 

(使用回车键设置默认值) 在此输入图片描述 第三步:设置配置文件

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

主机 gitlab.com
主机名 gitlab.com
用户 git
身份认证文件 ~/.ssh/id_rsa

第四步:

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

图片描述在此处输入

步骤5:
完成第4步后:
1.测试2.git文件将会下载完成
2.你将会在~/.ssh目录下得到新的文件(known_hosts)
图片描述在此处输入

注:我自己创建了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中央仓库、本地开发和生产机器。 这个答案没有经过充分测试
我提供非常具体的命令。 我将使用/root/git而不是<your folder>。 我唯一更改原始命令的地方是将我的特定服务器名称替换为example.com。 我将解释文件夹的目的,以便您可以相应地进行调整。 如果有任何困惑,请告诉我,我会更新答案。
服务器上的git版本为1.7.1。 服务器是CentOS 6.3(Final)。
开发机器上的git版本为1.8.1.1。 这是Mac OS X 10.8.4。
中央仓库和生产机器位于同一台机器上。
中央仓库,svn用户可以将其视为“服务器”,配置如下。 我有一个名为“flowers”的项目,我在文件夹/root/git中保存所有git存储库。 我想为该项目创建一个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

现在代码已经推送到develop分支。我也想将它添加到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在您的代码库内。


我误解了命令。我所做的是在当前目录下创建一个子目录树ssh:/myproject.git。我以为我正在克隆到远程目录,但实际上该命令所做的是从存储库克隆。 - dlsa

1

git clone git@server:Example/proyect.git


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的解决方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接