![](/img/trans.png)
[英]Why is this not being saved in public folder gives 404 error in Network?
[英]Why has GitLab saved one folder of my project as a Subproject commit?
我已经开始开发一个网站,保存在我的本地文件夹中,我正在尝试将其保存到 GitLab 存储库中。 我在 GitLab 上创建了一个新存储库,然后执行以下操作:
cd existing_folder
git init --initial-branch=main
git remote add origin https://gitlab.com/...
git add .
git commit -m "Initial commit"
git push -u origin main
该项目包含两个文件夹,Server 和 Client,Client 是一个 React App。 但是,客户端文件夹显示为无法打开的红色文件夹图标:
当我单击初始提交时,它说客户端已添加为子项目提交:
不知道这是什么意思,我之前也建过类似结构的网站,Gitlab没有做过。 我只想将 Client 和 Server 文件夹的内容保存在 repo 中。
我的猜测是您在错误的文件夹中执行 git 初始化。 现在您的客户端文件夹可能是实际顶部 git 存储库的子模块。
检查您的客户端文件夹中是否有 hidden.git 目录
要解决此问题,请删除 Client 目录中的 .git 文件夹。 还要检查顶部文件夹中名为sumodule的文件,如果存在则将其删除。
你做了什么:
创建了一个包含应用程序客户端的Git 存储库,并向其中提交了一些内容。 此存储库位于client/.git/
中。 它包含的文件可能命名为main.js
等(或main.ts
等,如果 TypeScript 等)。
在.git
中创建了第二个总体 Git 存储库,其中包含应用程序的服务器端,并为此提交了一些内容。 此存储库位于.git/
并包含名为server/functions.js
的文件等。 Git 将把第二个总体存储库称为superproject 。 它只是一个 Git 存储库,尽管它具有一个特殊属性。
请注意,就 Git 而言,文件夹甚至不存在:文件中只有带有嵌入斜杠的名称——总是正斜杠,从不反斜杠——在其中。 Git 将根据需要将这些转换为操作系统所需的文件夹和文件排列。 这也处理了操作系统需要的任何反斜杠(例如,在 Windows 上将名称从foo/bar.js
转换为foo\bar.js
)。 但在大多数情况下,这是不可见的,我们可以假装我们有一个装满文件的文件夹; 无论如何,我们将使用从提交中提取的操作系统级文件,这些文件实际上是文件夹中的文件。 因此,对于 rest,我们假设我们确实有文件夹。
无论如何,出于良好(安全)的目的, Git拒绝存储任何名为.git
的东西。 因此, client/.git/*
中的所有文件实际上都无法存储:您不能将client
中的子存储库放入 .git 中的超级项目中.
,即使./.git
保存server/
并且所有这些文件都很好。
相反,Git 将向超级项目添加 Git 称为gitlink 的内容。 这是一个条目,上面写着:克隆并签出超级项目的提交后,也克隆另一个 Git 存储库。 在那个新的、额外的 Git 存储库中,我保存了您应该在该子项目中签出的提交的原始 hash ID。
这就是您看到该说明的原因:
Subproject commit 327f06...88c
这就是使这个超级项目 Git 存储库成为超级项目的原因:它包含一个名为client
的gitlink ,而 gitlink 本身——否则就像一个文件——说327f06...88c
。 That 327f06...88c
hash ID is the hash ID of a commit in the Git repository that Git should clone and place into a client
folder within the superproject.
现在,这里的诀窍是让 Git 运行:
git clone <url> client && (cd client && git checkout 327f06...88c)
Git 需要知道url
才能在此命令行上使用。 gitlink 只记录提交 hash ID 和路径名client
。 URL 进入一个单独的文件,正如chickahoona 提到的,名为.gitmodules
。
问题是,当你跑的时候:
git add .
这不会为您创建.gitmodules
文件。 要创建该文件,您必须使用git submodule add
而不是git add
。 The git submodule add
command takes the same kind of argument as git add
—the name client
in this case—but also takes a URL, which it will add to the .gitmodules
file in the form that Git will need to run the git clone
command之后。
您不必在计算机上运行此git clone
命令,因为您已经在client/.git
中有一个 Git 存储库。 所以git add.
只完成了一半的工作不会影响您使用这个超级项目/gitlink 配对。 但这意味着没有其他人可以使用您的超级项目,因为缺少克隆指令。
不清楚的是,您个人是否希望将服务器和客户端存储在两个单独的 Git 存储库中(一个超级项目和一个子模块),或者您是否希望将其存储在三个Git 存储库中:
最后一个将是设置中唯一的超级项目,仅包含两个 gitlink 和一个引用两个子模块的.gitmodules
文件。 The server's files would be in a Git repository stored in server/.git
and the client's files would be in a Git repository stored in client/.git
(as they are now).
或者,也许您根本不想要任何子模块。 在这种情况下,您需要删除client/.git
文件夹(或将其移至其他位置)。 这将破坏(或移动到其他地方)包含客户端的整个存储库。 但是,您将保留该存储库中的所有工作树文件。 现在内部存储库已经消失,这些工作树文件可以是git add
到超级项目的内容中。 这些文件将命名为client/main.js
和 Git 将创建一个client/
文件夹并将它们解压缩到该client/
文件夹中名为main.js
的文件等。
只有你可以决定你想在这里做什么。 决定然后继续:要么使用git submodule add
正确添加子模块,要么将服务器也变成一个子模块并添加它,或者删除(或移动)客户端 Git存储库,但不是客户端文件的当前版本。
1天底下精灵王的三枚戒指,
矮人领主的七人在他们的石头大厅里……
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.