[英]Git clone using ssh does not work with message "git@github.com: No such file or directory"
[英]`ssh -vT git@github.com` works fine, and agent is in github ssh keys. Where is the issue?
我刚买了一台新机器,正在开发一个新的github存储库。 我将其克隆到我的机器上
git clone git@github.com:<username>/<exact-repo-name>.git
它克隆很好:
Cloning into '<exact-repo-name>'...
remote: Counting objects: ###, done.
remote: Total ### (delta 0), reused 0 (delta 0), pack-reused ###
Receiving objects: 100% (###/###), ### KiB | 0 bytes/s, done.
Resolving deltas: 100% (###/###), done.
Checking connectivity... done.
并且,我通过执行for remote in git branch -r; do git checkout -b $remote; done
本地添加所有远程分支: for remote in git branch -r; do git checkout -b $remote; done
for remote in git branch -r; do git checkout -b $remote; done
然后,当我尝试从任何分支中拉出时,使用
git pull origin/<branch-name>
我收到了一个非常常见的错误:
origin/<branch-name> does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
因此,我完成了所有步骤:
ssh -vT git@github.com
ssh-add -l
eval "$(ssh-agent -s)"
这些都成功了,我检查了ssh-add -l
的输出,发现它在我的github帐户的列表ssh项中。 我进入设置-> ssh键,在那里看到代理。
除了ssh
,还有某些用户权限吗?
我同意@Felix的观点,尽管这可能是伪装的,但这很可能不是SSH问题。 相反,我认为您的路径有问题。 您可以尝试像这样运行git clone
:
git clone https://username@github.com/username/exact-repo-name.git
这里的username
是您的GitHub用户名。 Git会提示您输入密码,因此您不必以纯文本形式输入密码。 请阅读这篇SO文章以获取更多信息。
这可能不是ssh问题,因为ssh问题通常会导致显示如下消息
fatal: The remote end hung up unexpectedly
最有可能是路径问题:远程路径中有多余的斜线或空格(或者如果应该有空格,则命令行中缺少引号),或者大小写错误。 仔细检查URL的其余部分。 这也可能正是它所说的,是一个权限问题-您确定要以该存储库的正确用户身份进行连接吗?
编辑:从您添加的详细信息来看,您似乎只是弄混了pull命令的语法。 如果这样做,是否有效?:
git checkout <branch-name>
git pull # Edit: don't do this without reading all of 'git help pull'
? 另外, git fetch --all
可行吗? ( git pull
只是git fetch
然后是git merge
。)
进一步编辑:我可以重现您的错误; 这是命令语法问题。 这里有更多示例:
“源”是本地文件夹中的git存储库; 我将其克隆到一个名为“ dest”的文件夹中:
$ git clone source dest
$ cd dest
现在,我在您的for
循环中执行git branch
命令:
$ git branch -r
origin/HEAD -> origin/master
origin/branch1
origin/branch2
origin/master
我希望第一行会引起问题,因为这将导致这些命令在for循环中运行:
git checkout -b "origin/HEAD"
git checkout -b "->"
...
(请注意,您的示例缺少`git branch -r`
周围的反引号,因此,如果您发布的内容实际上是您正在运行的内容,则最终将得到名为“ git”,“ branch”和“ -r”的分支,这实际上不是您想要的...如果您难以将反引号放入内联代码块中,请参阅https://meta.stackexchange.com/questions/55437/how-can-the-backtick-character-be-包含在代码中 )
然后,如果我尝试使用pull
命令,则会收到与您相同的错误:
$ git pull origin/branch1
fatal: 'origin/branch1' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
这是因为git pull
将远程存储库名称(origin)和远程分支名称(branch1)作为两个单独的参数,并用空格分隔。 所以这工作:
$ git pull origin branch1
From /tmp/source
* branch branch1 -> FETCH_HEAD
Already up-to-date.
但是,这可能并不是您想要的,因为您似乎想创建一堆本地分支以跟踪起源上的相同命名分支(例如,您想要一个名为“ branch1”的本地分支来跟踪“ origin / branch1”) 。 您的本地分支创建命令不包括设置跟踪,因此您实际得到的是一个名为“ origin / branch1”的本地分支和一个远程存储库“ origin”上的一个分支,也称为“ branch1”,即在运行您的for循环, git branch -a
的输出是:
$ git branch -a
master
origin/HEAD
origin/branch1
* origin/branch2
origin/master
remotes/origin/HEAD -> origin/master
remotes/origin/branch1
remotes/origin/branch2
remotes/origin/master
...因此有两个分支称为“ origin / branch1”,唯一使它们与众不同的是,在一种情况下,存储库是您的本地分支,分支的字面全名是“ origin / branch1”,而在在另一种情况下,存储库是远程存储库(命名为origin),而分支的字面全名是“ branch1”,记为“ origin / branch1”-使用它可能会非常混乱(在某些命令中, git会抱怨说“ origin / branch1不明确”,您会遇到问题)。
还请注意,您的for循环创建的每个新分支实际上只是master的副本(或原始的任何默认/选定分支),因为您没有为它们指定从远程分支开始。 也就是说,在您的克隆命令中,您选择了一个分支(可能是主分支)来设置本地存储库。 然后,您为for循环中的每一行告诉git“从现在所在的位置创建新分支”,因此尽管这些新分支中的每一个都在远程上具有所有不同的名称,但它们都是对您选择的第一个分支的引用克隆。 这可能不是您想要的。
我认为您真正想要的是为每个远程分支运行的命令:
$ git checkout --track origin/branch1
Branch branch1 set up to track remote branch branch1 from origin.
Switched to a new branch 'branch1'
实际上,如果您刚刚进行了新的克隆,则git checkout branch1
[不带-b
]会产生与我相同的效果-由于没有名为branch1的本地分支,因此git会在您克隆的存储库中查找一个分支从并设置跟踪(如果找到)。
...所以我想这整个帖子可以归结为:
-b
:)
参见https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches ,而git help pull
的输出可获取有关远程跟踪和拉git help pull
的更多信息。 其中有些有些微妙(甚至比我提到的所有警告还多:))。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.