Git 子模块无法在从私有 git 服务器克隆时递归

Git submodules fail to recurse at cloning from private git server

这个问题已被问过无数次,但总是与 public git 服务器(例如 github)结合使用。我正在设置自己的私人 git 服务器,这似乎进展顺利,直到我尝试克隆一个包含我之前提交并推动自己的子模块的项目。

当针对 github 提出这个问题时,答案似乎总是需要生成密钥对并且需要使用 [=32= 注册 public 密钥]中心。我很乐意在我的私人 git 服务器上注册我的 public 密钥,但我找不到任何关于此的文档。有可能吗?甚至 git-scm.com 中的文档也进入了 git 中心参考。

我的私人 git 服务器只不过是一个 Raspberry Pi 外置硬盘 运行 Raspbian 精简版。我做了三个项目,其中一个是主项目,另外两个作为子模块添加。我可以这样创建它,提交并推送,但是当我尝试使用 --recurse-submodules (或不使用然后使用子模块 init/update)克隆它时,子模块失败。但是,我可以克隆主项目范围之外的子模块。

我一直在搞网络设置,树莓派换了好几次IP。当我因此 运行 遇到问题时,我设置了一个指向我的路由器的 DNS 条目,并向路由器中的 Pi 添加了一个端口转发规则,这样我就可以有效地从世界各地访问我的私人服务器。因为 URL 发生了变化,并且不想在某个地方留下旧 URL 的残余,所以我只是重新开始了所有三个项目,但这对我没有帮助。

这是怎么回事?以下日志已匿名。 :)

更新1:问题出在克隆子模块时的身份验证。 /var/log/auth.log 显示在克隆子模块作为主项目克隆的一部分时登录失败:

Jan 13 15:07:56 raspberrypi sshd[3148]: Failed password for git from 192.168.1.18 port 62855 ssh2

我做的场景显示了错误,而且从主项目的上下文中克隆子模块也成功了:

 E:\Projects>git clone --recurse-submodules ssh://git@git.domain.com/gitdata/Project1.git
Cloning into 'Project1'...
git@git.domain.com's password:
warning: You appear to have cloned an empty repository.

E:\Projects>cp -r Project1.cleanBU/* Project1

E:\Projects>cp -r Project1.cleanBU/.gitignore Project1

E:\Projects>git add Src .gitignore
fatal: not a git repository (or any of the parent directories): .git

E:\Projects>cd Project1

E:\Projects\Project1>git add Src .gitignore

E:\Projects\Project1>git commit
[master (root-commit) 1e52450] Initial commit
 1145 files changed, 726152 insertions(+)
 create mode 100644 .gitignore
...
<<<zapped!>>>
...
 create mode 100644 Src/build.bat

E:\Projects\Project1>git push
git@git.domain.com's password:
Enumerating objects: 550, done.
Counting objects: 100% (550/550), done.
Delta compression using up to 8 threads
Compressing objects: 100% (527/527), done.
Writing objects: 100% (550/550), 1.27 MiB | 3.21 MiB/s, done.
Total 550 (delta 272), reused 0 (delta 0)
remote: Resolving deltas: 100% (272/272), done.
To ssh://git.domain.com/gitdata/Project1.git
 * [new branch]      master -> master

E:\Projects\Project1>git submodule add ssh://git@git.domain.com/gitdata/project2.git Src/project2
Cloning into 'E:/Projects/Project1/Src/project2'...
git@git.domain.com's password:
remote: Counting objects: 202, done.
remote: Compressing objects: 100% (162/162), done.
remote: Total 202 (delta 36), reused 202 (delta 36)
Receiving objects: 100% (202/202), 586.16 KiB | 4.73 MiB/s, done.
Resolving deltas: 100% (36/36), done.

E:\Projects\Project1>git submodule add ssh://git@git.domain.com/gitdata/project3.git Src/project3
Cloning into 'E:/Projects/Project1/Src/project3'...
git@git.domain.com's password:
remote: Counting objects: 18, done.
remote: Compressing objects: 100% (18/18), done.
remote: Total 18 (delta 0), reused 0 (delta 0)Receiving objects:  44% (8/18)
Receiving objects: 100% (18/18), 15.94 KiB | 5.31 MiB/s, done.

E:\Projects\Project1>git add .gitmodules

E:\Projects\Project1>git commit
[master d93cfa4] Added project3 and project2 submodules
 3 files changed, 8 insertions(+)
 create mode 100644 .gitmodules
 create mode 160000 Src/project2
 create mode 160000 Src/project3

E:\Projects\Project1>git push
git@git.domain.com's password:
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 596 bytes | 596.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To ssh://git.domain.com/gitdata/Project1.git
   1e52450..d93cfa4  master -> master

E:\Projects\Project1>cd ..

E:\Projects>rm -rf Project1

E:\Projects>git clone --recurse-submodules ssh://git@git.domain.com/gitdata/Project1.git
Cloning into 'Project1'...
git@git.domain.com's password:
remote: Counting objects: 554, done.
remote: Compressing objects: 100% (259/259), done.
remote: Total 554 (delta 273), reused 549 (delta 272)
Receiving objects: 100% (554/554), 1.27 MiB | 5.96 MiB/s, done.
Resolving deltas: 100% (273/273), done.
Submodule 'Src/project2' (ssh://git@git.domain.com/gitdata/project2.git) registered for path 'Src/project2'
Submodule 'Src/project3' (ssh://git@git.domain.com/gitdata/project3.git) registered for path 'Src/project3'
Cloning into 'E:/Projects/Project1/Src/project2'...
Permission denied, please try again.
Permission denied, please try again.
git@git.domain.com: Permission denied (publickey,password).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
fatal: clone of 'ssh://git@git.domain.com/gitdata/project2.git' into submodule path 'E:/Projects/Project1/Src/project2' failed
Failed to clone 'Src/project2'. Retry scheduled
Cloning into 'E:/Projects/Project1/Src/project2'...
Permission denied, please try again.
Permission denied, please try again.
git@git.domain.com: Permission denied (publickey,password).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
fatal: clone of 'ssh://git@git.domain.com/gitdata/project2.git' into submodule path 'E:/Projects/Project1/Src/project2' failed
Failed to clone 'Src/project2' a second time, aborting
Cloning into 'E:/Projects/Project1/Src/project3'...
Permission denied, please try again.
Permission denied, please try again.
git@git.domain.com: Permission denied (publickey,password).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
fatal: clone of 'ssh://git@git.domain.com/gitdata/project3.git' into submodule path 'E:/Projects/Project1/Src/project3' failed
Failed to clone 'Src/project3'. Retry scheduled
Cloning into 'E:/Projects/Project1/Src/project3'...
Permission denied, please try again.
Permission denied, please try again.
git@git.domain.com: Permission denied (publickey,password).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
fatal: clone of 'ssh://git@git.domain.com/gitdata/project3.git' into submodule path 'E:/Projects/Project1/Src/project3' failed
Failed to clone 'Src/project3' a second time, aborting

E:\Anheko\Projecten>git clone ssh://git@git.domain.com/gitdata/project2.git
Cloning into 'project2'...
git@git.domain.com's password:
remote: Counting objects: 18, done.
remote: Compressing objects: 100% (18/18), done.
Rremote: Total 18 (delta 0), reused 0 (delta 0)eceiving objects:  44% (8/18)
Receiving objects: 100% (18/18), 15.94 KiB | 5.31 MiB/s, done.

Using git daemon perhaps or http(s) this might work? Gonna try git daemon

git daemon has no authentication,所以不会询问密码,这意味着访问您服务器的每个人都可以克隆存储库。

I don't want everyone to be able to clone my repositories and 2: I am not sure how to set it up that you do not need a password.

如果您的服务器依赖于 SSH,您需要将您的 public 密钥 (~/.ssh/id_rsa.pub) 发布到 git@yourserver:~git/.ssh/authorized_keys: 任何克隆都不需要您输入任何密码 (假设您的私钥不受密码保护)

ssh-copy-id git@yourserver

如果您的服务器使用的是 https 服务器,那么您需要通过 Git credential storage (on a Windows client, for instance, that would be using the Microsoft GCM).

缓存您的凭据 (username/password)