首页 > 解决方案 > Git 子模块在从私有 git 服务器克隆时无法递归

问题描述

这个问题已经被问过无数次了,但总是与使用公共 git 服务器(如 github)结合使用。我正在设置我自己的私有 git 服务器,这似乎一切正常,直到我尝试使用我之前提交并自己推送的子模块克隆一个项目。

当关于 github 提出这个问题时,答案似乎总是需要生成密钥对,并且需要在 github 上注册公钥。我很乐意在我的私人 git 服务器上注册我的公钥,但我找不到任何关于此的文档。甚至可能吗?甚至来自 git-scm.com 的文档也汇集到了 github 参考中。

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

我一直在玩弄网络设置,并且 Pi 已经更改了几次 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.

标签: gitserverprivategit-submodules

解决方案


也许使用 git daemon 或 http(s) 这可能有效?打算试试 git 守护进程

git daemon没有身份验证,因此不会询问密码,这意味着访问您的服务器的每个人都可以克隆存储库。

我不希望每个人都能够克隆我的存储库和 2:我不知道如何设置它不需要密码。

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

ssh-copy-id git@yourserver

如果您的服务器使用的是 https 服务器,那么您需要通过Git 凭证存储(例如,在使用 Microsoft GCM的 Windows 客户端上)缓存您的凭证(用户名/密码)。


推荐阅读