繁体   English   中英

为什么 GitLab 将我的项目的一个文件夹保存为子项目提交?

[英]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。 但是,客户端文件夹显示为无法打开的红色文件夹图标:

1

当我单击初始提交时,它说客户端已添加为子项目提交:

2

不知道这是什么意思,我之前也建过类似结构的网站,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 存储库成为超级项目的原因:它包含一个名为clientgitlink ,而 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 存储库中:

  • 一个仅用于服务器,
  • 一个仅供客户使用,并且
  • 一个绑定他们。 1

最后一个将是设置中唯一的超级项目,包含两个 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM