' ssh -vT git@github.com '工作正常,代理是在github ssh密钥.问题在哪里?



我刚买了一台新机器,我正在做一个新的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

然后,当我尝试从任何分支上拉时,使用

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密钥列表中。进入Settings -> ssh keys,可以看到代理。

是否有特定的用户权限是在那些ssh之上?

我同意@Felix的观点,这很可能不是SSH问题,尽管它可能伪装成这样。相反,我觉得你的道路有问题。您可以尝试像这样运行git clone:

git clone https://username@github.com/username/exact-repo-name.git

这里的username是你的GitHub用户名。Git会提示您输入密码,这样您就不必以纯文本形式输入密码了。

这可能不是ssh问题,因为ssh问题通常会导致像

这样的消息
fatal: The remote end hung up unexpectedly

很可能是路径问题:要么在远程路径中有额外的斜杠或空格(或者如果应该有空格,则在命令行中缺少引号),要么某些字母大小写错误。再次检查URL的其余部分。也可能就是它所说的权限问题——您确定以正确的用户身份连接这个存储库吗?

编辑:从你添加的细节来看,看起来你只是把拉命令的语法混淆了。如果你这样做会有效吗?:
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)

进一步编辑:我可以复制你的错误;这是一个命令语法问题。下面是更多的例子:

"source"是本地文件夹中的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"one_answers"-r"的分支,这真的不是您想要的……)如果在内联代码块中插入反号有困难,请参见https://meta.stackexchange.com/questions/55437/how-can-the-backtick-character-be-included-in-code)

然后,如果我尝试您的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

…所以有两个分支称为"起源/branch1",和唯一的不同是,在一个案例中,存储库是当地的一个分支的文字的全名是"起源/branch1",而在其他情况下,存储库是远程(名为起源)和分支的文字的全名是"branch1",这是建议,"起源/branch1"——这可能会非常混乱使用(在某些命令,git会抱怨说,"origin/branch1是模棱两可的",你会遇到问题)。

还要注意,你的for循环创建的每个新分支实际上只是master的一个副本(或者任何默认/选择的分支),因为你没有指定它们从一个远程分支开始。也就是说,在您的clone命令中,您的本地存储库被设置为选择了一个分支(可能是主分支)。然后,你告诉git"从我现在所在的位置创建新分支",为你的for循环中的每一行,所以每个新分支,尽管在远程上有所有不同的分支名称,都是对克隆选择的第一个分支的引用。这可能不是你想要的。

我认为你真正想要的是这个命令,为每个远程分支运行:

$ 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的输出,了解远程跟踪和拉拔的更多信息;其中一些有点微妙(甚至比我提到的所有警告还要微妙:))。

最新更新